内置开放函数中模式a、a+、w、w+和r+之间的区别?

在python内置的开放函数中,模式waw+a+r+之间的确切区别是什么?

特别是,留档意味着所有这些都允许写入文件,并表示它打开文件以进行“附加”,“写入”和“更新”,但没有定义这些术语的含义。

614344 次浏览

打开模式与C标准库函数fopen()的打开模式完全相同。

BSD#0手册定义如下:

 The argument mode points to a string beginning with one of the followingsequences (Additional characters may follow these sequences.):
``r''   Open text file for reading.  The stream is positioned at thebeginning of the file.
``r+''  Open for reading and writing.  The stream is positioned at thebeginning of the file.
``w''   Truncate file to zero length or create text file for writing.The stream is positioned at the beginning of the file.
``w+''  Open for reading and writing.  The file is created if it does notexist, otherwise it is truncated.  The stream is positioned atthe beginning of the file.
``a''   Open for writing.  The file is created if it does not exist.  Thestream is positioned at the end of the file.  Subsequent writesto the file will always end up at the then current end of file,irrespective of any intervening fseek(3) or similar.
``a+''  Open for reading and writing.  The file is created if it does notexist.  The stream is positioned at the end of the file.  Subse-quent writes to the file will always end up at the then currentend of file, irrespective of any intervening fseek(3) or similar.

选项与C标准库中的fopen函数相同:

w截断文件,覆盖已经存在的内容

a附加到文件,添加到已经存在的任何内容

w+打开读取和写入,截断文件,但也允许您读取已写入文件的内容

a+打开用于追加和读取,允许您追加到文件并读取其内容

我偶然发现了这个,试图弄清楚为什么你会使用“w+”模式而不是“w”模式。最后,我只是做了一些测试。我看不出“w+”模式有什么用途,因为在这两种情况下,文件一开始就被截断。然而,使用“w+”,你可以通过回溯来写入后读取。如果你尝试使用“w”进行任何读取,它会引发IOError。在“w+”模式下不使用查找进行读取不会产生任何结果,因为文件指针将在你写入的位置之后。

我注意到,我时不时地需要再次谷歌fopen,只是为了建立一个关于模式之间主要区别的心理形象。所以,我想下次阅读图表会更快。也许其他人也会发现这很有帮助。

同样的信息,只是表格形式

                  | r   r+   w   w+   a   a+------------------|--------------------------read              | +   +        +        +write             |     +    +   +    +   +write after seek  |     +    +   +create            |          +   +    +   +truncate          |          +   +position at start | +   +    +   +position at end   |                   +   +

其中的含义是:(为了避免误解)

  • read-允许从文件读取

  • 写-允许写入文件

  • create-如果文件还不存在,则创建文件

  • truncate-在打开文件时,它被清空(文件的所有内容都被擦除)

  • 开始时的位置-打开文件后,初始位置设置为文件的开始

  • 末尾位置-文件打开后,初始位置设置为文件末尾

注意:aa+总是附加到文件末尾-忽略任何seek移动。
有趣的行为至少在我的win7/python2.7上,对于在a+模式下打开的新文件:
write('aa'); seek(0, 0); read(1); write('b')-第二个write被忽略
write('aa'); seek(0, 0); read(2); write('b')-秒write举起IOError

我认为这对于跨平台执行很重要,即作为CYA。:)

在Windows上,“b”附加到模式以二进制模式打开文件,因此也有“rb”,“wb”和“r+b”等模式。Windows上的Python区分文本和二进制文件;当读取或写入数据时,文本文件中的行尾字符会自动略微更改。这种对文件数据的幕后修改对于ASCII文本文件很好,但它会破坏像JPEG或EXE文件中那样的二进制数据。读取和写入此类文件时要非常小心使用二进制模式。在Unix上,在模式中附加“b”没有坏处,因此您可以独立于平台对所有二进制文件使用它。

这是直接引用自Python软件基金会2.7. x

我发现重要的是要注意python 3对打开模式的定义与这里的答案不同,这些答案对于Python 2是正确的。

Python 3打开模式是:

'r' open for reading (default)'w' open for writing, truncating the file first'x' open for exclusive creation, failing if the file already exists'a' open for writing, appending to the end of the file if it exists----'b' binary mode't' text mode (default)'+' open a disk file for updating (reading and writing)'U' universal newlines mode (for backwards compatibility; should not be used in new code)

模式rwxa与模式修饰符bt组合。+是可选添加的,U应避免。

正如我发现的那样,在文本模式下打开文件时始终指定t是一个好主意,因为r是标准open()函数中rt的别名,但在所有压缩模块的open()函数中是rb的别名(例如,当读取*.bz2文件时)。

因此,打开文件的模式应该是:

rt/wt/xt/at用于读取/写入/创建/附加到文本模式下的文件

rb/wb/xb/ab用于读取/写入/创建/附加到二进制模式的文件。

像以前一样使用+

rr+xx+ww+一个a+
可读xxxxx
可写的xxxxxxx
默认位置:开始xxxxxx
默认位置:结束xx
必须存在xx
不能存在xx
加载时截断(清除文件)xx
总是给EOF写信

如果未选择模式,则使用文本模式(t)。因此rrt相同。