【问题标题】:seek(), then read(), then write() in python在python中寻找(),然后读取(),然后写入()
【发布时间】:2009-04-23 22:25:29
【问题描述】:

运行以下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()
    '一个'
    f.seek(-10,2)
    f.write('\n')

第二次搜索调用的实际参数似乎无关紧要。

【问题讨论】:

  • 您使用的是什么操作系统和python版本?这似乎适用于 Linux 2.6.17 下的 Python 2.4.3。
  • 这正是您想要做的,还是简化?如果这是手头的任务,为什么不直接以“a”打开,然后调用 f.write,而无需干预搜索?
  • 另外(对 Lance),它在 Windows XP 上的 Python 2.5 中根本不起作用。
  • 好的,我在 Windows XP Pro 下使用 Python 2.4.3 看到了同样的错误。嗯...

标签: python file-io


【解决方案1】:

这似乎是一个特定于 Windows 的问题 - 请参阅 http://bugs.python.org/issue1521491 了解类似问题。

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

f.seek(f.tell())

在 read() 和 write() 调用之间。

【讨论】:

  • 或者,更确切地说,f.seek(0, 1),以避免额外的函数调用。
  • 我遇到了类似的问题,通过这个技巧可以解决,但我使用的是 Xubuntu 15.04 和 Python 3.4.3。见my question
【解决方案2】:

a+模式用于追加,如果你想读写,你正在寻找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

【讨论】:

  • 这就是为什么 Daphna 的问题说“用“r+”打开时会发生同样的事情。”
【解决方案3】:

为我工作:

$ 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+'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多