为什么在python中以'w'模式打开文件时会截断

Ani*_*esh 44 python

我正在阅读Zed Shaw的Python书.我目前正致力于开放和阅读文件章节.我想知道为什么我们需要做截断,当我们已经在'w'模式下打开文件?

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

print "Truncating the file. Goodbye!"
target.truncate()
Run Code Online (Sandbox Code Playgroud)

ism*_*ail 45

这是多余的,因为您注意到,在写入模式下打开将覆盖该文件.有关Input and OutputPython文档部分的更多信息.


Len*_*bro 34

因此Zed Shaw在已被截断的文件上调用truncate().好的,这是毫无意义的.他为什么这样做?谁知道!?问他!

也许他这样做表明该方法存在?可能是,但这将是非常愚蠢的,因为我作为一名程序员在15年内从未需要截断文件,所以它在新手书中没有位置.

也许他这样做是因为他认为他必须截断文件,而他根本不知道这是毫无意义的?

也许他故意混淆新手?这符合他的一般作案手法,这似乎是故意无缘无故地惹恼人们.

更新:他这样做的原因现在很清楚.在后面的版本中,他将这个问题列为本章中的"常见问题",并告诉您去阅读文档.因此有:

  1. 教你阅读文档.
  2. 在复制粘贴之前,了解从某处复制粘贴的代码的每个部分.

如果这是一个好的教学风格你可以辩论,我不知道.

"帮助我不明白Zed Shaws书"的数量已经减少,所以我不能说它比任何其他书都差,这可能意味着它比许多人好.:-)

  • @sayth:我同意他的一般方法,但它引起了很多问题.那些已经平息,也许他已经解决了这些问题.例如,这个问题现在被列为本章中的"常见问题",Zed告诉您去阅读文档并自己解决.所以也许它现在是一本好书. (2认同)

小智 18

如果您在提出问题之前阅读问题,他会为您解答:

额外的信用: "如果你觉得你不理解这一点,请回过头来使用评论技巧让它在你的脑海中消失.每行上面的一个简单的英文评论将帮助你理解,或者至少让你知道你是什么需要研究更多.

编写一个类似于上一个练习的脚本,该练习使用readargv读取您刚刚创建的文件.

这个文件中的重复次数太多了.使用字符串,格式和逃逸打印出来line1,line2line3只有一个 target.write()命令,而不是6.

找出为什么我们必须传递一个'w'额外的参数来打开.提示:通过明确表示要编写文件,打开尝试安全.

如果你用'w'模式打开文件,那么你真的需要 target.truncate()吗?

去阅读Python的开放函数的文档,看看是否正确." - Zed Shaw.

他明确地希望你自己找到这些东西,这就是为什么他的额外功劳很重要.

他还明确表示他希望你注意细节.每件小事都很重要.

  • 这一切都很好,但并不总是一种有用的教学方式.我更倾向于从一开始就教授正确的方法,并解释*为什么*它是正确的,而不是从无用的东西开始,然后期待读者可能会打扰看起来像一个无意义的额外信用问题隐藏一个实际有用的信息块. (11认同)

Bru*_*sky 11

虽然在'w'模式下打开时截断是没有用的,但在'r +'中它很有用.虽然这不是OP的问题,但我会把这个留在这里给那些像我一样在谷歌领先的人.

假设您打开(使用模式'r +',记住没有'rw'模式)5行缩进的json文件并将json.load-ed对象修改为仅3行.如果target.seek(0)在将数据写回文件之前,最终会产生2行尾随垃圾.如果你target.truncate()这样你就不会.

我知道这似乎是显而易见的,但我在这里是因为我正在修复一个在多年后保持完全相同大小的对象之后发生的错误...由于签名算法的改变而缩小了.(不显而易见的是我必须添加的单元测试以防止将来发生这种情况.我写了我最长的文档字符串,解释了为什么我用2种荒谬的人工算法来测试签名.)

希望这有助于某人.

  • 谢谢.这个答案,即使这并没有真正回答问题,也完全适合我的用例 (2认同)

小智 6

使用truncate(),您可以根据文件中当前所处的位置声明要删除的文件数量.没有参数,truncate()就像w一样,而w总是只是擦干整个文件.因此,这两种方法可以完全相同,但不一定.