目前正在教自己Python,并通过编写脚本来学习文件I / O,以便从现有文件中读取和添加文本.脚本运行直到我调用write()方法,此时它会抛出一个非特定的异常 – 这是回溯:
File "test.py", line 13, in <module>
f.write(txt)
IOError: [Errno 0] Error
我的代码:
from sys import argv
script, filename = argv
f = open(filename, 'a+')
print("The contents of %s are:") % filename
print f.read()
txt = raw_input("What would you like to add? ")
f.write(txt)
print("The new contents are:")
print f.read()
f.close()
我的环境是Win7,PowerShell和Notepad中的Python 2.7.3.
是什么造成的?我该如何解决?根据我的理解,访问模式应该允许我读取和附加到文件.将访问模式更改为r会产生相同的异常.
澄清:
>我有一个现有的文本文件(a.txt),其中包含一个单词,我将其作为参数传递给脚本,如下所示:
python test.py a.txt
>我在Windows下的管理员帐户下.
结果:
至少,添加两个seek()命令可以解决问题 – 详见答案文章.
解决方法:
当一个人试图添加一个小尺寸的文本时出现问题:它保留在缓冲区中,在接收到更多数据之后,在实际写入之前保留文本.
所以,为了确保真正写,请按照有关os.fsync()和flush()的文档中的说明进行操作.
顺便说一下,最好使用with语句.
使用二进制模式仍然更好.在你的情况下,应该没有问题,因为你只需在阅读后添加文本,只需使用seek(o,o).但是当想要将文件的指针正确移动到文件的字节中时,绝对有必要使用二进制模式[open(文件名,’rb’)中的’b’]
我个人从不使用’a’,我从未理解它的影响是什么.
from sys import argv
from os import fsync
script, filename = argv
with open(filename, 'rb+') as f:
print("The contents of %s are:") % filename
print f.read()
f.seek(0,2)
txt = raw_input("What would you like to add? ")
f.write(txt)
f.flush()
fsync(f.fileno())
f.seek(0,0)
print("The new contents are:")
print f.read()