在Python中使用seek()、read()和write()函数

7
在运行以下Python代码时:
>>> f = open(r"myfile.txt", "a+")        
>>> f.seek(-1,2)                                        
>>> f.read()                                            
'a'                                                     
>>> f.write('\n')                                        

我收到了以下(有用的)异常:
Traceback (most recent call last):      
  File "<stdin>", line 1, in <module>   
IOError: [Errno 0] Error        

使用“r+”打开文件时也会发生同样的事情。

这是应该失败的吗?为什么?

编辑:

  1. 显然,这只是一个例子,不是我真正要执行的操作。我实际的目标是验证文件以“\n”结尾或添加一个新行后再添加新行。
  2. 我在Windows XP下工作,问题存在于Python 2.5和Python 2.6中。
  3. 我通过再次调用seek()来绕过问题:

    f = open(r"myfile.txt", "a+")
    f.seek(-1,2)
    f.read()
    'a'
    f.seek(-10,2)
    f.write('\n')

第二个seek调用的实际参数似乎无关紧要。


你使用的操作系统和Python版本是什么?在Linux 2.6.17下,Python 2.4.3似乎可以正常工作。 - Lance Richardson
这正是你想要做的吗,还是一个简化?如果这是手头的任务,为什么不只需以“a”打开,然后调用f.write,而不进行任何中间的寻找? - kyle
还有(对于Lance),这在Windows XP上的Python 2.5中根本不起作用。 - kyle
好的,我在Windows XP Pro下使用Python 2.4.3也看到了相同的错误。嗯... - Lance Richardson
3个回答

5

3
或者,更确切地说,使用f.seek(0, 1)来避免多余的函数调用。 - tzot
我遇到了一个类似的问题,这个技巧解决了我的问题,但是我正在使用Python 3.4.3的Xubuntu 15.04。请参见我的问题 - user793458

1

a+ 模式是用于追加的,如果你想要读写,你需要使用 r+。

试试这个:

>>> f = open("myfile.txt", "r+")
>>> f.write('\n')

编辑:

你应该最初指定你的平台...在Windows下seek存在已知问题。 当尝试寻找时,UNIX和Win32具有不同的行结束符,分别为LF和CRLF。 还有一个读取文件末尾的问题。 我认为你正在寻找文件末尾的seek(2)偏移量,然后从那里继续。

这些文章可能会对你有用(第二篇更具体):

http://coding.derkeiler.com/Archive/Python/comp.lang.python/2004-08/2512.html

http://mail.python.org/pipermail/python-list/2002-June/150556.html


这就是为什么达芙娜的问题说:“使用'r+'打开时也会发生同样的事情。” - sblom

0

适用于我:

$ echo hello > myfile.txt
$ python
Python 2.5.2 (r252:60911, Oct  5 2008, 19:24:49) 
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open('myfile.txt', 'r+')
>>> f.seek(-1, 2)
>>> f.tell()
5L
>>> f.read()
'\n'
>>> f.write('\n')
>>> f.close()

你是在使用Windows吗?如果是的话,请尝试在模式中使用'rb+'而不是'r+'

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