rw +和r +有什么区别

Moo*_*sez 5 python file-io python-2.x python-3.x

我在做一些文件IO时偶然发现了这个stackoverflow问题:被python文件模式“ w +”弄糊涂了

  • r 阅读
  • w 用于写作
  • r+ 打开以进行读写(无法截断文件)
  • w+ 用于读写(可以截断文件)
  • rb+ 读取或写入二进制文件
  • wb+ 编写二进制文件
  • a+ 打开进行追加

请注意,r+不能截断文件。因此,我一直在寻找可以在读取文件后截断文件的东西,这导致我转到了另一个SO链接:Python在读取行时截断了行

我看到他们使用了另一种模式rw+,该模式没有记录。从答案中使用它的方式来看,我猜想它的意思是“开放供阅读,书写和截断,但不截断开放”。

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

Python 2:

f = open("myfile.txt", "rw+")
text = f.read()
f.truncate(0)
f.close()
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

但是,我需要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()
Run Code Online (Sandbox Code Playgroud)

什么都不会打印。

Python 3:

f = open("myfile.txt", "r+")
text = f.read()
f.truncate(0)
f.seek(0, 0)
print(f.read())
f.close()
Run Code Online (Sandbox Code Playgroud)

也不会打印任何内容。

我的问题是,如果同时r+rw+可以截断,什么是在Python 2它们之间的区别是什么?

Jam*_*tle 3

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

f1 = open('f1', 'r+')
f2 = open('f2', 'rw+')
f3 = open('f3', 'w+')
Run Code Online (Sandbox Code Playgroud)

及其相应的操作系统系统调用(使用 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
Run Code Online (Sandbox Code Playgroud)

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

说用“r+”打开的文件对象不能用于截断文件是不准确的 - 它只是在文件打开时不这样做。