我正在阅读 Zed Shaw 的 Python 书籍。目前我正在学习有关打开和读取文件的章节。我想知道,既然我们已经用 'w' 模式打开了文件,为什么还需要执行 truncate 操作呢?
print "Opening the file..."
target = open(filename, 'w')
print "Truncating the file. Goodbye!"
target.truncate()
我正在阅读 Zed Shaw 的 Python 书籍。目前我正在学习有关打开和读取文件的章节。我想知道,既然我们已经用 'w' 模式打开了文件,为什么还需要执行 truncate 操作呢?
print "Opening the file..."
target = open(filename, 'w')
print "Truncating the file. Goodbye!"
target.truncate()
这是多余的,正如你所注意到的,以写模式打开文件将覆盖该文件。更多信息请参见Python文档中的输入和输出
部分。
所以 Zed Shaw 对已经被截断的文件调用了 truncate() 方法。好吧,那很无意义。他为什么这样做呢?谁知道呢?问问他吧!
也许他这样做是为了展示该方法的存在?可能吧,但那太愚蠢了,因为作为一个程序员,我在15年的职业生涯中从未需要过截断文件,所以它在一本新手书中没有任何用处。
也许他之所以这样做是因为他认为他必须截断文件,而他并不知道这是无意义的?
也许他故意这样做来困惑新手?这符合他的一般行事方式,似乎他的唯一目的就是毫无理由地刻意惹怒人们。
更新:现在清楚了他这样做的原因。在后续版本中,他将此问题列为章节中的“常见问题”,并告诉你去阅读文档。因此,它的目的是为了:
你可以争论这是否是一种好的教学方式,我不知道。
在 SO 上,“帮助我不理解 Zed Shaw 的书”问题的数量已经减少了,所以我不能说它比其他任何书更糟糕,这可能意味着它比许多书更好。 :-)
target.seek(0)
而不是target.truncate()
,则如果您写入文件的内容比原始内容短,文件末尾将会有“缓冲区下溢”样式的垃圾数据。我在我的答案https://dev59.com/AG455IYBdhLWcg3wD_2Z#31863528中解释了我的经验。 - Bruno Bronoskyos.open
打开的,则可能需要进行文件截断。或者,为了默认执行该操作,请不要忘记传递os.O_TRUNC
标志。 - AndreyS Scherbakov尽管在以'w'模式打开时截断不是很有用,但在'r+'模式下是有用的。虽然这不是OP的问题,但我会留下这个回答,以供像我一样通过谷歌搜索到这里的其他人参考。
假设你使用(以'r+'模式)打开了一个缩进了5行的json文件,并将 json.load
读入的对象修改为仅3行。如果在将数据写回文件之前使用 target.seek(0)
,则最终会得到2行垃圾数据。如果使用 target.truncate()
则不会出现这种情况。
我知道这似乎很明显,但我的BUG修复是因为一个对象多年来保持完全相同的大小...由于签名算法的更改而缩小了。(不明显的是我必须添加的单元测试,以防止类似问题再次发生。 我写了自己有史以来最长的文档字符串,解释为什么要使用两个荒谬的算法进行签名测试。)
希望这能帮助到某些人。
.truncate()
的习惯。这样他们就知道如何处理通过open(filename, 'r+')
打开的可读写文件。 - Bruno Bronosky使用truncate()
函数可以根据当前文件的位置来声明要删除多少文件。不带参数时,truncate()
函数的行为类似于w,而w总是会将整个文件清除。所以,这两种方法可以表现相同,但并非总是如此。
truncate()
。 - Eric O. Lebigot这只是标准posix语义的一种反映。请参见man fopen(3)。Python只是将其包装起来。
fopen(3)
函数说明已经提到它会自动截断,因此不需要使用额外的 truncate()
函数。 - ismail最近遇到了一个场景,我需要创建大文件进行测试。其中一种快速的方法是使用 truncate
命令:
with open('filename.bin', 'wb') as f:
f.truncate(1024 * 1024 * 1024) # 1GB
该文件没有内容,但向操作系统报告您想要的大小,并在许多测试场景中起作用。
以下是我的代码,它只取文件中最后16位数字的标记:
with open('saver.txt', 'rb+') as f:
text_len = len(f.read())
f.truncate(text_len-16)
f.close()
我打开文件
从文件中截取16个字符,稍后将由我替换。
请注意,我在只读模式下使用它,如果我在写入模式下使用,则文件将被完全截断,并且当我们的截断命令出现时会抛出错误。
回答这个问题已经过去8.4年了。:)