为什么在Python中以'w'模式打开文件时要截断?

60 投票
9 回答
116199 浏览
提问于 2025-04-16 09:12

我正在学习Zed Shaw的Python书,现在正在研究打开和读取文件的章节。我想知道,既然我们已经以'w'模式打开文件,为什么还需要进行截断操作呢?

print "Opening the file..."
target = open(filename, 'w')

print "Truncating the file. Goodbye!"
target.truncate()

9 个回答

23

虽然在以'w'模式打开文件时截断没有什么用,但在'r+'模式下就很有用了。虽然这不是提问者的问题,但我还是想把这个信息留给那些像我一样通过谷歌找到这里的人。

假设你用'r+'模式打开了一个有5行缩进的json文件,然后把读取到的内容修改成只有3行。如果你在把数据写回文件之前用target.seek(0)把光标移到文件开头,你会发现文件最后会多出2行无用的垃圾内容。如果你用target.truncate(),就不会有这个问题。

我知道这看起来很明显,但我之所以在这里,是因为我在修复一个bug,这个bug发生在一个对象在多年里保持不变的情况下...因为签名算法的改变而变小了。(不明显的是,我不得不添加单元测试来防止将来再出现这个问题。我写了我最长的文档字符串,解释为什么我用两个非常牵强的算法来测试签名。)

希望这对某些人有帮助。

37

所以,Zed Shaw在一个已经被截断的文件上调用truncate()方法。好吧,这样做其实没什么意义。他为什么要这么做呢?谁知道呢!?去问问他吧!

也许他是想展示这个方法的存在?有可能,但这样做其实挺傻的,因为我在编程15年里从来没需要过截断文件,所以这在一本新手书里根本没必要。

也许他是觉得必须要截断文件,但他根本不知道这样做是没意义的?

或者他故意这么做是为了让新手困惑?这倒是符合他的一贯风格,似乎总是无缘无故地让人烦恼。

更新:现在他这么做的原因很清楚了。在后来的版本中,他把这个问题列为章节中的“常见问题”,并告诉你去阅读文档。所以这样做的目的是:

  1. 教你如何阅读文档。
  2. 在你复制粘贴代码之前,理解你复制的每一部分代码。

你可以讨论这是否是好的教学风格,我也不太清楚。

在Stack Overflow上,关于“我不理解Zed Shaw的书”的问题数量已经减少,所以我不能说这本书比其他书差,这可能意味着它比很多书都要好。:-)

61

这有点多余,因为正如你所注意到的,以写入模式打开文件会覆盖掉原来的内容。想了解更多信息,可以查看输入和输出部分的Python文档。

撰写回答