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

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


当前回答

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

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

其中含义如下:(只是为了避免任何误解)

read-允许从文件读取write-允许写入文件create-如果文件还不存在,则创建该文件truncate-在打开文件时,文件将变为空(文件的所有内容都将被删除)起始位置-打开文件后,初始位置设置为文件的起始位置结束位置-打开文件后,初始位置设置为文件的结尾

注意:a和a+始终附加到文件末尾-忽略任何搜索移动。顺便说一下,对于以+模式打开的新文件,至少在我的win7/python2.7上有有趣的行为:写('aa');搜索(0,0);阅读(1);write('b')-忽略第二次写入写('aa');搜索(0,0);阅读(2);write('b')-第二次写入引发IOError

其他回答

我注意到,我时不时地需要在谷歌上搜索一遍,只是为了在脑海中建立一个模式之间主要区别的形象。所以,我想下次看图表会更快。也许其他人也会觉得这很有用。

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

我发现需要注意的是,python3定义的打开模式与这里的答案不同,这些答案对Python2来说是正确的。

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)

模式r、w、x、a与模式修改器b或t组合在一起。如果选择添加+,则应避免使用U。

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

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

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

rb/wb/xb/ab,用于以二进制模式读取/写入/创建/追加文件。

如前所述使用+。

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

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

其中含义如下:(只是为了避免任何误解)

read-允许从文件读取write-允许写入文件create-如果文件还不存在,则创建该文件truncate-在打开文件时,文件将变为空(文件的所有内容都将被删除)起始位置-打开文件后,初始位置设置为文件的起始位置结束位置-打开文件后,初始位置设置为文件的结尾

注意:a和a+始终附加到文件末尾-忽略任何搜索移动。顺便说一下,对于以+模式打开的新文件,至少在我的win7/python2.7上有有趣的行为:写('aa');搜索(0,0);阅读(1);write('b')-忽略第二次写入写('aa');搜索(0,0);阅读(2);write('b')-第二次写入引发IOError

我认为这对于跨平台执行(即作为CYA)来说非常重要。:)

在Windows上,附加到模式的“b”以二进制模式打开文件,因此也有类似“rb”、“wb”和“r+b”的模式。Windows上的Python区分了文本文件和二进制文件;当读取或写入数据时,文本文件中的行尾字符会自动轻微更改。这种对文件数据的幕后修改对于ASCII文本文件来说很好,但它会破坏二进制数据,就像JPEG或EXE文件中的二进制数据一样。在读取和写入此类文件时,请非常小心地使用二进制模式。在Unix上,在模式中附加一个“b”并不有害,因此您可以对所有二进制文件独立地使用它。

这直接引用自Python Software Foundation 2.7.x。