seek(),然后读取(),然后在python中写入()

时间:2009-04-23 22:25:29

标签: python file-io

运行以下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')

        
      
  4. 第二次搜寻电话的实际参数似乎并不重要。

3 个答案:

答案 0 :(得分:5)

这似乎是特定于Windows的问题 - 有关类似问题,请参阅http://bugs.python.org/issue1521491

更好的是,在http://mail.python.org/pipermail/python-bugs-list/2005-August/029886.html给出并解释了一种解决方法,插入:

f.seek(f.tell())
read()和write()调用之间的

答案 1 :(得分:1)

a +模式用于附加,如果你想阅读&amp;写,你正在寻找r +。

试试这个:

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

修改

你应该最初指定你的平台......在windows中寻找已知的问题。在尝试搜索时,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

答案 2 :(得分: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()
你在窗户上吗?如果是,请在模式中尝试'rb+'而不是'r+'