在python内置的开放函数中,w、a、w+、a+和r+模式之间的确切区别是什么?
特别是,文档暗示所有这些都将允许写入文件,并表示它将打开文件以进行“附加”、“写入”和“更新”,但没有定义这些术语的含义。
在python内置的开放函数中,w、a、w+、a+和r+模式之间的确切区别是什么?
特别是,文档暗示所有这些都将允许写入文件,并表示它将打开文件以进行“附加”、“写入”和“更新”,但没有定义这些术语的含义。
当前回答
我注意到,我时不时地需要在谷歌上搜索一遍,只是为了在脑海中建立一个模式之间主要区别的形象。所以,我想下次看图表会更快。也许其他人也会觉得这很有用。
其他回答
我认为这对于跨平台执行(即作为CYA)来说非常重要。:)
在Windows上,附加到模式的“b”以二进制模式打开文件,因此也有类似“rb”、“wb”和“r+b”的模式。Windows上的Python区分了文本文件和二进制文件;当读取或写入数据时,文本文件中的行尾字符会自动轻微更改。这种对文件数据的幕后修改对于ASCII文本文件来说很好,但它会破坏二进制数据,就像JPEG或EXE文件中的二进制数据一样。在读取和写入此类文件时,请非常小心地使用二进制模式。在Unix上,在模式中附加一个“b”并不有害,因此您可以对所有二进制文件独立地使用它。
这直接引用自Python Software Foundation 2.7.x。
r | r+ | x | x+ | w | w+ | a | a+ | |
---|---|---|---|---|---|---|---|---|
readable | x | x | x | x | x | |||
writeable | x | x | x | x | x | x | x | |
default position: start | x | x | x | x | x | x | ||
default position: end | x | x | ||||||
must exist | x | x | ||||||
mustn't exist | x | x | ||||||
truncate (clear file) on load | x | x | ||||||
Always write to EOF | x | x |
Mode
t (default) | b | |
---|---|---|
str (io.TextIOBase ) |
x | |
bytes (io.BufferedIOBase ) |
x |
如果未选择任何模式;使用文本模式(t)。因此,r与rt相同。
我偶然发现了这一点,试图弄清楚为什么你会使用模式“w+”而不是“w”。最后,我只是做了一些测试。我看不出模式“w+”有多大用途,因为在这两种情况下,文件都是从开头截断的。然而,使用“w+”,您可以在写作后通过查找来阅读。如果尝试使用“w”进行任何读取,将引发IOError。在“w+”模式下不使用搜索进行读取不会产生任何结果,因为文件指针将在您写入的位置之后。
相同的信息,只是表格形式
| 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
许多人特别疑惑的是“r+和w+模式之间有什么区别?”?
r+帮助您在不截断的情况下将数据读写到已经存在的文件上(如果没有这样的文件,则为错误)。
另一方面,w+模式也允许读取和写入,但它会截断文件(如果不存在这样的文件,则会创建一个新文件)。如果您想知道如何从截断的文件中读取,可以使用读取方法来读取新写入的文件(或空文件)。
干杯