4

目前正在自学 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。

这是什么原因造成的?我将如何解决它?据我了解,a+访问模式应该允许我读取和附加到文件。将访问模式更改为会r+产生相同的异常。

说明:

  • 我有一个现有的文本文件 (a.txt),其中包含一个单词,我将其作为参数传递给脚本,如下所示:

            python test.py a.txt
    
  • 我在 Windows 的管理员帐户下。

结果:

至少,添加两个seek()命令可以解决问题 - 答案帖子中有详细说明。

4

2 回答 2

1

当您以模式打开文件时,由于某种原因print f.read()在 OS X 上对我不起作用。a+

在 Max OS X 上,将打开模式更改为r+,然后在第二次读取之前添加f.seek(0)一行使其工作。可悲的是,这对 Windows 没有帮助。

这是 Mac OS 上的工作代码:

from sys import argv

script, filename = argv

f = open(filename, 'r+')

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:")

f.seek(0)
print f.read()

f.close()

这是我可以让它在 Windows 7 上工作的唯一方法:

from sys import argv

script, filename = argv

f = open(filename, 'r')

print("The contents of %s are:") % filename

print f.read()
f.close()

txt = raw_input("What would you like to add? ")

f = open(filename, 'a')
f.write(txt)
f.close()
f = open(filename, 'r')

print("The new contents are:")

print f.read()

f.close()

这似乎超级hacky。这也应该适用于 Mac OS X。

于 2012-12-13T00:15:18.120 回答
1

尝试添加小文本时的问题:它保留在缓冲区中,在接收到更多数据后,在真正写入完成之前保留文本。
所以,为了确保真正写,按照文档中关于os.fsync()flush()

顺便说一句,最好使用with语句。

并且使用二进制模式会更好。在您的情况下,应该没有问题,因为您只需在阅读后添加文本并使用seek(o,o). 但是当想要将文件的指针正确移动到文件的字节中时,绝对有必要使用二进制模式 [ 'b'in open(filename, 'rb+') ]

我个人从不使用'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()
于 2012-12-13T00:58:07.560 回答