【发布时间】:2016-01-19 14:26:08
【问题描述】:
在对another question 的回答中,观察到一种奇怪的行为,特定于 Python 3。documentation for the truncate command 状态(强调我的):
将流的大小调整为以字节为单位的给定大小(如果未指定大小,则为当前位置)。当前的流位置没有改变。这种调整大小可以扩展或减小当前文件大小。在扩展的情况下,新文件区域的内容取决于平台(在大多数系统上,附加字节是零填充的)。 返回新的文件大小。
不过……
>>> open('temp.txt', 'w').write('ABCDE\nFGHIJ\nKLMNO\nPQRST\nUVWXY\nZ\n')
32
>>> f = open('temp.txt', 'r+')
>>> f.readline()
'ABCDE\n'
>>> f.tell()
6 # As expected, current position is 6 after the readline
>>> f.truncate()
32 # ?!
不是在当前位置 (6) 截断,而是在文件末尾截断(即根本不截断)。这是通过检查磁盘上的文件来验证的。
此过程在 Python 2 中按预期工作(文件被截断为 6 个字节),并且在 Python 3 中使用 StringIO 而不是文件。为什么 Python 3 中的文件不能按预期工作?这是一个错误吗?
(编辑:如果在truncate 之前给出明确的f.seek(6),它也可以正常工作。)
【问题讨论】:
-
如果您在打开第二个文件对象之前
close第一个文件对象,是否还会出现这种情况? -
@Kevin 是的。 (评论填充)
-
这种行为是否与上下文管理
with ... as f以及您使用的是哪个特定版本的python 3 相同?你也可以先做f.seek(6),然后再做f.truncate()吗?我不知道这个错误,并且想要提到的事情,但我正在旅途中。 (我知道with ...只是围绕f = open(),但同样,在所有理论实现中都可以找到奇怪的故障和失误) -
@Torxed 刚刚编辑添加了一个明确的
seek在truncate之前确实可以正常工作。我试过 3.4.1 和 3.4.3。它已被其他人复制,但我无法说出他们的具体版本。 -
@glibdud 不确定我是否应该为此写一个答案。但我很高兴
.truncate()没有通过事先隐含地调用它自己的搜索来破坏.seek(x)。
标签: python python-3.x file-io