我在做一些文件IO时偶然发现了这个stackoverflow问题:Confused by python file mode "w+"
请注意,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中它们之间有什么区别? 最佳答案
至少在Linux上,据我所知没有任何区别。这是一个测试脚本
f1 = open('f1', 'r+')
f2 = open('f2', 'rw+')
f3 = open('f3', 'w+')
及其相应的操作系统syscall(使用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。
说用'r +'打开的文件对象不能用于截断文件是不正确的-只是在打开文件时不这样做。