似乎在Windows上,对于使用
我执行以下代码:
我希望代码能够打印出
这在Linux上运行良好。但是,当我在Windows上运行它时,消息被正确显示,但文件没有被改变 - 就像
然而,如果我在
有人知道Windows下这种行为的原因吗?
供参考,我正在使用Python 2.7.3,在带有NTFS分区的Windows 7上运行。
编辑
响应评论,我尝试了
r+
(或r+b
)权限打开的文件,在read()
之后立即进行write()
操作不会更新文件。假设当前目录中有一个名为testfile.txt
的文件,其内容如下:This is a test file.
我执行以下代码:
with open("testfile.txt", "r+b") as fd:
print fd.read(4)
fd.write("----")
我希望代码能够打印出
This
并将文件内容更新为以下内容:This----a test file.
这在Linux上运行良好。但是,当我在Windows上运行它时,消息被正确显示,但文件没有被改变 - 就像
write()
被忽略了一样。如果我在文件句柄上调用tell()
,它会显示位置已经更新(在write()
之前是4
,之后是8
),但文件没有变化。然而,如果我在
write()
行之前放置一个显式的fd.seek(4)
,那么一切都按照我的预期工作。有人知道Windows下这种行为的原因吗?
供参考,我正在使用Python 2.7.3,在带有NTFS分区的Windows 7上运行。
编辑
响应评论,我尝试了
r+b
和rb+
- 官方Python文档似乎暗示前者是规范的。
我在不同的地方调用了fd.flush()
,并且像这样在read()
和write()
之间放置一个:
with open("testfile.txt", "r+b") as fd:
print fd.read(4)
fd.flush()
fd.write("----")
...产生了以下有趣的错误:
IOError: [Errno 0] Error
编辑2
间接地,添加flush()
有所帮助,因为它引导我找到了this post,描述了类似的问题。如果其中一位评论者是正确的,那么这是底层Windows C库中的一个错误。
read()
和write()
。但这仅意味着每次从调用read()
切换到调用write()
时,您都应该插入一个fd.seek(0, os.SEEK_CUR)
的调用,如Abhijit在他的答案中提到的那样。这的效果是说“将指针移动到它已经在的地方”,但这样做可以使其工作(我不会说“修复问题”,因为这显然是一个主观的问题)。如果您这样做,您可以自由混合使用read()
和write()
,而不需要再次打开文件。此行为仅适用于Windows。 - Cartroo