rw +和r +有什么区别

时间:2016-12-31 06:40:28

标签: python python-3.x file-io python-2.x

我在做一些文件IO时偶然发现了这个stackoverflow问题:Confused by python file mode "w+"

  
      
  • r阅读
  •   
  • w撰写
  •   
  • r+打开以进行读写(不能截断文件)
  •   
  • w+用于书写和阅读(可以截断文件)
  •   
  • rb+读取或写入二进制文件
  •   
  • wb+编写二进制文件
  •   
  • a+会打开以追加
  •   

请注意r+无法截断文件。所以我一直在寻找可以在阅读后截断文件的内容,这导致我进入另一个SO链接:Python truncate lines as they are read

我看到他们使用了另一种模式,rw+,没有记录。从答案的使用方式来看,我猜测它意味着开放阅读,写作和截断,但不要在开放时截断。

我后来测试了这个模式,它似乎在Python 3中删除了,因此在使用时抛出ValueError

Python 2:

f = open("myfile.txt", "rw+")
text = f.read()
f.truncate(0)
f.close()

Python 3:

f = open("myfile.txt", "rw+")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: must have exactly one of create/read/write/append mode

但是,我需要Python 3中的文件模式,它既可以截断也可以读取,但不能在打开时截断。因此,经过一些测试后,我发现r+实际上可以在Python 2和3中截断。

Python 2:

f = open("myfile.txt", "r+")
text = f.read()
f.truncate(0)
f.seek(0, 0)
print f.read()
f.close()

不打印任何内容。

Python 3:

f = open("myfile.txt", "r+")
text = f.read()
f.truncate(0)
f.seek(0, 0)
print(f.read())
f.close()

也会打印出来。

我的问题是,如果r+rw+都可以截断,那么Python 2中它们之间有什么区别?

1 个答案:

答案 0 :(得分:0)

至少在Linux上,据我所知,没有区别。这是一个测试脚本

f1 = open('f1', 'r+')
f2 = open('f2', 'rw+')
f3 = open('f3', 'w+')

及其相应的OS系统调用(使用strace);在python 2.7.9上测试。

open("f1", O_RDWR|O_LARGEFILE)          = 3
open("f2", O_RDWR|O_LARGEFILE)          = 4
open("f3", O_RDWR|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 5

有关文件访问和创建标志的更多详细信息,请参阅http://man7.org/linux/man-pages/man2/open.2.html

用&#39; r +&#39;打开文件对象并不准确。 无法用于截断文件 - 它只是在文件打开时不会这样做。