python中文件打开模式_在python中以“ w”模式打开文件时为什么要截断

在python中以“ w”模式打开文件时为什么要截断

我正在阅读Zed Shaw的Python书。 我目前正在研究打开和阅读文件章节。 我想知道为什么我们已经以'w'模式打开文件时为什么要截断?

print "Opening the file..."

target = open(filename, 'w')

print "Truncating the file. Goodbye!"

target.truncate()

Animesh asked 2020-07-31T17:16:18Z

8个解决方案

43 votes

正如您所注意到的那样,这是多余的,因为以写入模式打开将覆盖文件。 有关更多信息,请参见Python文档的Input and Output部分。

ismail answered 2020-07-31T17:22:06Z

33 votes

因此Zed Shaw对已经被截断的文件调用truncate()。 好的,那毫无意义。 他为什么要这样做? 谁知道!? 问他!

也许他这样做是为了表明该方法存在? 可能会,但是那很愚蠢,因为在我作为程序员的15年中,我从来不需要截断文件,因此在新手书中没有位置。

也许他这样做是因为他认为自己必须截断该文件,而他根本不知道该文件没有意义?

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

更新:他这样做的原因现在很清楚。 在以后的版本中,他在本章中将该问题列为“常见问题”,并告诉您阅读文档。 因此可以:

教您阅读文档。

在复制粘贴之前,请了解从某个位置复制粘贴的代码的每个部分。

您不知道这是否是一种良好的教学风格,我不知道。

关于SO的“帮助我不理解Zed Shaws的书”的数量减少了,所以我不能说它比那里的其他任何书都要糟糕,这可能意味着它比许多其他书要好。 :-)

Lennart Regebro answered 2020-07-31T17:23:02Z

18 votes

如果您在问之前先阅读问题,他会为您回答:

额外的功劳:“如果您觉得自己不明白,请返回 通过并使用注释技巧使它在您的脑海中消失。 每行上方有一个简单的英语注释,可以帮助您理解, 或至少让您知道您需要进一步研究。

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

该文件中的重复太多。 使用字符串,格式和 转义仅打印一个即可打印出line1、line2和line3 'w'命令而不是6。

找出为什么我们必须传递'w'作为额外的参数才能打开。 暗示: 开放让您明确地说出自己想要写一个 文件。

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

请阅读Python开放功能文档,看看是否正确。”-Zed Shaw。

他明确希望您自己找到这些东西,这就是为什么他的额外信誉很重要。

他还明确表示他希望您支付注意细节。 每件事都很重要。

Dch47 answered 2020-07-31T17:23:58Z

11 votes

虽然以“ w”模式打开时截断没有用,但在“ r +”中有用。 虽然这不是OP的问题,但我将把这个问题留给像我一样被Google领导的任何人。

假设您打开(使用“ r +”模式,请记住没有“ rw”模式)一个5行缩进的json文件,并将json.load-ed对象修改为仅3行。 如果在将数据写回到文件之前有2991017823423693893825,则最终将出现2行尾随垃圾。 如果您2991017823423693893826则不会。

我知道这似乎很明显,但是我在这里是因为我正在修复一个错误,该错误是在对象保持完全相同的大小多年之后...由于签名算法的更改而缩小了。 (不明显的是,为了防止将来出现这种情况,我不得不添加单元测试。我写了我最长的文档字符串,解释了为什么我要使用2种可笑的算法对签名进行测试。)

希望这对某人有帮助。

Bruno Bronosky answered 2020-07-31T17:24:34Z

6 votes

使用truncate(),您可以根据文件中的当前位置声明要删除的文件数量。 没有参数,truncate()的行为类似于w,而w始终只是将整个文件擦除。 因此,这两种方法可以起到相同的作用,但不一定。

Kristin Gannon answered 2020-07-31T17:24:54Z

1 votes

这只是标准posix语义的反映。 参见man fopen(3)。 Python只是将其包装。

Keith answered 2020-07-31T17:25:14Z

0 votes

在写入模式下打开文件时,将截断原始文件(之前的所有内容都将被删除)。 然后,无论您写入什么内容,都将添加到文件中。 问题是,写入要从头开始添加信息,而当指针放在末尾时引发IOError。 对于这种类型的写作,您需要使用append(使用'a +'参数打开文件)。

YATIN GUPTA answered 2020-07-31T17:25:35Z

0 votes

场景:

我当时正在制作一个勒索软件,需要对文件进行加密,我的目的不是要加密整个文件,而仅仅是为了破坏它,这是因为我希望它能快速执行任务,从而节省了加密所有文件的时间,所以我 决定只编辑一些文本。

现在如果我使用write,那么这里的目的就被破坏了,因为我必须将文件a写入z。 那我该怎么办?

好在这里可以使用截断。

以下是我的代码,该代码仅在文件中使用最后16位数字的令牌:

with open('saver.txt', 'rb+') as f:

text_len = len(f.read())

f.truncate(text_len-16)

f.close()

我打开文件

截断文件中的16个字符,稍后将由我替换。

请注意,我在只读模式下使用它,如果在写模式下使用,则File将被完全截断,并且当我们输入truncate命令时,它将引发错误。

8.4年后回答这个问题。 :)

Kush answered 2020-07-31T17:29:22Z

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值