在内置的蟒蛇开放的功能,是个什么模式之间准确的区别w
,a
,w+
,a+
,和r+
?
特别地,文档暗示所有这些都将允许写入文件,并说它打开文件专门用于“追加”,“写入”和“更新”,但未定义这些术语的含义。
在内置的蟒蛇开放的功能,是个什么模式之间准确的区别w
,a
,w+
,a+
,和r+
?
特别地,文档暗示所有这些都将允许写入文件,并说它打开文件专门用于“追加”,“写入”和“更新”,但未定义这些术语的含义。
Answers:
打开模式与C标准库功能完全相同fopen()
。
BSD手册fopen
页对它们的定义如下:
The argument mode points to a string beginning with one of the following
sequences (Additional characters may follow these sequences.):
``r'' Open text file for reading. The stream is positioned at the
beginning of the file.
``r+'' Open for reading and writing. The stream is positioned at the
beginning 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 not
exist, otherwise it is truncated. The stream is positioned at
the beginning of the file.
``a'' Open for writing. The file is created if it does not exist. The
stream is positioned at the end of the file. Subsequent writes
to 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 not
exist. The stream is positioned at the end of the file. Subse-
quent writes to the file will always end up at the then current
end of file, irrespective of any intervening fseek(3) or similar.
w
和w+
两者都可以做The file is created if it does not exist
b
追加到模式以二进制方式打开文件,所以也有类似的模式rb
,wb
和r+b
。Windows上的Python区分文本文件和二进制文件。当读取或写入数据时,文本文件中的行尾字符会自动更改。
+
如果不是,则不会做一致的独立操作a
,w
或者r
?还是我看不到模式?模式是什么?
我注意到,我不时需要重新打开Google,只是为了构想两种模式之间的主要区别是什么。因此,我认为下一次阅读图会更快。也许其他人也会发现它也有帮助。
a
描述是错误的。写入始终位于末尾。
Subsequent writes to the file will always end up at the then current end of file, irrespective of any intervening fseek(3) or similar
比仅仅说初始位置是终点要强一些。
相同信息,只是表格形式
| r r+ w w+ a a+
------------------|--------------------------
read | + + + +
write | + + + + +
write after seek | + + +
create | + + + +
truncate | + +
position at start | + + + +
position at end | + +
意义在哪里:(为避免任何误解)
写入-允许写入文件
create-如果尚不存在则创建文件
截断-在打开文件期间将其清空(删除了文件的所有内容)
开始位置-打开文件后,初始位置设置为文件的开始
注意:a
并且a+
始终附加到文件末尾-忽略任何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
open(file,'a'); close(); open(file,'r+')
过去常常做到这一点。
a
和a+
write 总是在文件末尾发生seek()
。
我认为对于跨平台执行(即作为CYA),考虑这一点很重要。:)
在Windows上,附加到模式的'b'以二进制模式打开文件,因此也有'rb','wb'和'r + b'之类的模式。Windows上的Python区分文本文件和二进制文件。当读取或写入数据时,文本文件中的行尾字符会自动更改。对于ASCII文本文件,对文件数据进行这种幕后修改是可以的,但它会破坏JPEG或EXE文件中的二进制数据。读写此类文件时,请务必小心使用二进制模式。在Unix上,将'b'附加到该模式没有什么坏处,因此您可以独立于平台将其用于所有二进制文件。