【问题标题】:file.write() jumps to a random position python 2.7file.write() 跳转到一个随机位置 python 2.7
【发布时间】:2013-09-10 19:21:31
【问题描述】:

我在解释器中玩耍,file.write() 方法表现得很奇怪,我希望有人能解释一下。

>>> file.seek(0)
>>> file.tell()
0
>>> file.readline()
'The Project Gutenberg EBook of The Adventures of Sherlock Holmes\n'
>>> file.tell()
65
>>> file.realine()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'file' object has no attribute 'realine'
>>> file.readline()
'by Sir Arthur Conan Doyle\n'
>>> file.tell()
91
>>> file.write("line\n")
>>> file.tell()
4101
>>> 

为什么 file.write("line\n") 会跳转到 4101?

文件是这个的副本:http://norvig.com/big.txt以 r+ 模式打开

【问题讨论】:

  • 您在什么平台上运行它? Windows、Linux、Mac 还是其他?
  • 我在 Macbook Pro 上运行它。
  • 您的代码不完整。你是怎么分配给file的?
  • file = open('big.txt', 'r+')

标签: python


【解决方案1】:

Python 的一些实现使用read-ahead buffer for readline. 所以在调用readline 之后,文件句柄的位置不一定位于刚刚读取的行尾。

【讨论】:

  • 还要注意 4101 是 4096 + 5 -- 5 是 "line\n" 的长度。 4096 是一个非常典型的缓冲区大小。
  • 你可以用file.seek(0, 1)重置缓冲区。
【解决方案2】:

在这里工作的不仅仅是缓冲区:如果您要混合读取和写入文件,您必须在从读取切换到写作,或从写作到阅读。 “必须”是指行为未定义,否则 - 它可能会或可能不会在任何给定平台上工作,并且在单个平台上可能在某些情况下似乎有效但在其他情况下无效。这是我在 2005 年给出的答案的链接(哈哈!这是一个老问题),其中包含对 C 标准的引用(Python 的大部分文件 I/O 行为都继承自平台 C 库):

https://mail.python.org/pipermail/python-bugs-list/2005-August/029886.html

【讨论】:

  • 漂亮,谢谢。我在使用 for line in file: 时遇到了类似的问题,感觉我最终可能会这样做。感谢您的确认。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 1970-01-01
相关资源
最近更新 更多