Python open('file', 'r+')给出了奇怪的结果

5
阅读了一些帖子后,似乎可以使用'r+'或'w+'模式打开文件进行读写。然而,尝试使用这些模式总是给我奇怪的结果:
  1. 如果我使用'r+',调用file.read(),然后调用file.write('str'),会出现错误"IOError: [Errno 0] Error"
  2. 如果我使用'r+',调用file.write('str'),然后调用file.read(),它将返回意外和非常长的内容(看起来像某个对象的内部)
  3. 如果我使用'w+',调用file.read()将返回空字符串
我想做的是打开一个文件,读取内容,修改它,然后写回去。目前我是用'r'打开它,改变内容,然后再用'w'重新打开并写回去。这样做好吗?
这里有一个例子:http://snipt.org/zglJ0 我正在使用Windows 7和Python 2.7.2。

3
您能分享一个代码片段来展示问题吗? - Joachim Isaksson
上述三个实验都是通过file.close()关闭的。然而,在同一个实验中同时执行read()和write()操作(不在两者之间调用close())会导致奇怪的结果。 - Xun Yang
这个可以在Windows和Linux上都运行吗? - tMC
你能否请发一下你试图实现的代码片段?我已经写了一小段代码,它的功能完全符合预期。另外,你使用的是哪个版本的Python? - pri0ritize
我正在使用Windows和Python 2.7.2。 (抱歉,我之前放了错误的代码,现在是导致问题的代码 :)) - Xun Yang
1个回答

5

当在更新模式下打开文件并在读写之间切换时,您需要调用flush()。或者,我认为您也可以使用seek()。这是由于Python 2.x中Windows文件实现的一些奇怪行为所致;它们在3.x中进行了修复。


嗨,Kindall!感谢您的回答,但是flush方法似乎不起作用(是的,我正在使用Windows和Python 2.7.2)。我的代码如下: '>>> f=open('f1.txt~','r+')
f.read() 'blablabl' f.flush() f.write('aaa')
Traceback (most recent call last): File "<pyshell#120>", line 1, in <module> f.write('aaa') IOError: [Errno 0] Error
f.close()'
- Xun Yang
2
你可以尝试使用 f.seek(0, 1) (在文件中寻找当前位置)。 - kindall
可以的!在这种情况下,为每个不同的操作关闭和重新打开似乎更易读。 - Xun Yang
1
编写一个上下文管理器来实现这个功能应该非常简单。 - kindall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接