python open内置函数:模式a,a +,w,w +和r +之间的区别?

fly*_*ire 555 python

在内置的蟒蛇开放的功能,是个什么模式之间准确的区别w,a,w+,a+,和r+

特别是,文档暗示所有这些都允许写入文件,并说它打开文件"具体"附加",写入"和"更新",但没有定义这些术语的含义.

drA*_*erT 674

打开模式与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.
Run Code Online (Sandbox Code Playgroud)

  • 注意:Python v3添加了许多其他模式.[链接到docs](http://docs.python.org/3.3/library/functions.html#open) (12认同)
  • 注意到`w`和`w +`都可以做`如果文件不存在则创建文件' (4认同)
  • 我是否正确地说,如果是`a`,`w`或`r`,`+`不会做一致的独立事情?或者我没有看到这种模式?模式是什么? (4认同)
  • 我相信你的意思是C标准库中的fopen调用(这不是系统调用) (3认同)
  • 在Windows上,附加到模式的`b`以二进制模式打开文件,因此还有像`rb`,`wb`和`r + b`这样的模式.Windows上的Python区分了文本和二进制文件; 读取或写入数据时,文本文件中的行尾字符会自动稍微改变. (3认同)
  • @CharlieParker:我相信模式是“也做其他事情”。因此,“r+”不仅打开文件用于读取,还用于“写入”,而“w+”不仅打开文件用于写入,还用于“读取”。对于“a+”也是如此。 (3认同)
  • @johnstamos > 为什么 w+ 存在?因为您可能想在关闭文件之前使用相同的文件指针进行读取。 (3认同)
  • 为什么默认的Python文档如此糟糕?https://docs.python.org/2/library/functions.html#open是否为您链接到的BSD手册页等内置函数提供了一套不错的文档? (2认同)

And*_*bis 449

我注意到,我不时需要谷歌重新开始,只是为了建立一个心理图像,了解模式之间的主要区别.所以,我认为下一次阅读图表会更快.也许其他人也会觉得有帮助.

  • @And我相信@Antti指的是属性`对文件的后续写入总是会在文件的当前结尾处结束,而不管是否有任何介入的fseek(3)或类似的东西,这比仅仅说出**位置是结束. (10认同)
  • 对于后代:truncate意味着从头开始覆盖. (10认同)
  • @CharlieParker基本上有两个文件操作(读,写).模式_r_主要用于读取,模式_w _,_ a_主要用于写入.并且**加号使得给定模式的第二次操作**(简单地说). (5认同)
  • 所以“+”基本上意味着写作。奇怪的是,“w”并不意味着这个意思,而是意味着截断...(阅读下一个答案后,似乎“w”会覆盖,而“a”代表追加。这更有意义...)如果文件不存在,您对创建文件有什么意见吗? (4认同)
  • @MinhTran你并没有覆盖现有的内容,你首先把它扔掉,然后写得好像那里什么都没有一样。如果文件包含字符串“aaaaa”,并且我截断并将“ttt”写入文件,则结果不会是“tttaa”,而只是“ttt”。 (4认同)
  • “ a”描述是错误的。写入始终位于末尾。 (2认同)
  • @Jeyekomon您在这里发表评论的摘要可能是我在尝试以某种我现在可以记住的方式绕过这些模式时所读过的最有用的一件事!该答案中的流程图很漂亮,下面的答案中的表格很好,但是如果这些答案(以及其他答案)都是从这个简单的观点开始并从那里开始起作用的,那将有助于提供更好的思维框架来充实细节。上。那谢谢啦。(我知道这可能是垃圾邮件的边缘,但我认为您的评论值得承认) (2认同)

ind*_*112 186

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

                  | r   r+   w   w+   a   a+
------------------|--------------------------
read              | +   +        +        +
write             |     +    +   +    +   +
write after seek  |     +    +   +
create            |          +   +    +   +
truncate          |          +   +
position at start | +   +    +   +
position at end   |                   +   +
Run Code Online (Sandbox Code Playgroud)

含义是:(只是为了避免任何误解)

  • 读 - 允许从文件读取
  • 写 - 允许写入文件

  • 如果文件尚不存在,则创建文件

  • trunctate - 在打开文件期间,它变为空(文件的所有内容都被删除)

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

  • 最后的位置 - 文件打开后,初始位置设置为文件的结尾

注意:a并且a+始终附加到文件末尾 - 忽略任何seek移动.
BTW.至少在我的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'); 关(); 打开(文件,'r +')`来完成这个. (9认同)
  • @CharlieParker这意味着文件的所有内容都被删除(文件为空) (3认同)
  • 在这种情况下,"截断"意味着什么? (2认同)
  • 如何更新表,为 Python 3 包含“x”? (2认同)

Pei*_*ayz 40

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
rr+Xx+w瓦+A一个+
可读的\xe2\x88\x9a\xe2\x88\x9a\xe2\x88\x9a\xe2\x88\x9a\xe2\x88\x9a
可写的\xe2\x88\x9a\xe2\x88\x9a\xe2\x88\x9a\xe2\x88\x9a\xe2\x88\x9a\xe2\x88\x9a\xe2\x88\x9a
默认位置:开始\xe2\x88\x9a\xe2\x88\x9a\xe2\x88\x9a\xe2\x88\x9a\xe2\x88\x9a\xe2\x88\x9a
默认位置:结束\xe2\x88\x9a\xe2\x88\x9a
必须存在\xe2\x88\x9a\xe2\x88\x9a
一定不存在\xe2\x88\x9a\xe2\x88\x9a
加载时截断(清除文件)\xe2\x88\x9a\xe2\x88\x9a
始终写入 EOF\xe2\x88\x9a\xe2\x88\x9a
\n
\n

模式

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
t(默认)
str( io.TextIOBase)\xe2\x88\x9a
bytes( io.BufferedIOBase)\xe2\x88\x9a
\n
\n

如果没有选择模式;t使用文本模式 ( )。因此r与 相同rt

\n

  • “始终写入 EOF”是什么意思? (2认同)
  • @qff EOF 代表文件结束。“always”意味着即使您使用“seek(0)”(将光标移动到文件开头),当您使用“write("foo")”时,文件也会写入到文件末尾。这就是为什么它被称为“追加”模式。您始终将其附加到文件末尾。 (2认同)

Eli*_*ght 38

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

w 截断文件,覆盖已有的文件

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

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

a+ 打开以进行追加和读取,允许您附加到文件并读取其内容

  • 在这种情况下,“截断”是什么意思?如果旧数据有一些,是否意味着删除旧数据?或者其他更具体的东西? (5认同)
  • @CharlieParker:正确 - 这意味着现有文件中的所有数据都将被删除,我们开始从现在空文件的开头写入. (2认同)

ing*_*yer 10

我发现需要注意的是,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)
Run Code Online (Sandbox Code Playgroud)

模式r, w, x,与模式修饰符或a组合。是可选添加的,应该避免。bt+U

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

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

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

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

像以前一样使用+


Wyr*_*ood 8

我试图弄清楚为什么你会使用'w +'模式和'w'模式.最后,我做了一些测试.我没有看到模式'w +'的目的太多,因为在这两种情况下,文件都被截断为开头.但是,使用'w +',您可以在写完之后通过回复来阅读.如果您尝试使用'w'进行任何读取,则会引发IOError.不使用模式'w +'进行读取不会产生任何结果,因为文件指针将位于您编写的位置之后.


Gor*_* B. 8

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

在Windows上,附加到模式的'b'以二进制模式打开文件,因此还有'rb','wb'和'r + b'等模式.Windows上的Python区分了文本和二进制文件; 读取或写入数据时,文本文件中的行尾字符会自动稍微改变.这种对文件数据的幕后修改适用于ASCII文本文件,但它会破坏像JPEG或EXE文件中的二进制数据.在读取和写入此类文件时要非常小心地使用二进制模式.在Unix上,将'b'附加到模式没有什么坏处,因此您可以独立于平台使用它来处理所有二进制文件.

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