【问题标题】:Substitute file content in Python [duplicate]在Python中替换文件内容[重复]
【发布时间】:2014-09-26 17:36:39
【问题描述】:

我想这是一个已经问了两万次的问题,但我不明白为什么文件总是空的。我想打开一个文件,从整个文件中删除一个字符串,然后重写内容,但文件最终为空。这是我使用的代码:

f = open(filename,'w+')
f.write(f.read().replace(str_to_del,""))
f.close()

但是文件总是空的。如果我改为使用“r+”,则会附加内容,并且文件中有重复的文本。我正在使用 Python 3.3 。我错过了什么?

【问题讨论】:

  • 冒着看起来很愚蠢的风险,你不是用空字符串替换所有内容吗?
  • 是的,事实上。 w+ 清空文件,我想知道它为什么会这样。那么f没有文件的内容,那我该怎么办呢?
  • 简答:在'r'打开一次获取内容,在'w'再次打开替换现有内容。
  • @Novalink:如果您不知道为什么w+ 模式会清空文件,请阅读open 函数(或交互式会话中的help(open))的文档;它将解释什么模式的意思。
  • @Novalink 这只是教程,您需要库参考:docs.python.org/3.4/library/functions.html#open

标签: python


【解决方案1】:

w+ 模式打开文件会截断文件。因此,您的 f.read() 保证不会返回任何内容。

您可以通过以r+ 模式打开文件,读取它,然后调用f.seek(0),然后写入来执行此操作。或者以r 模式打开文件,读取它,关闭它,以w 模式重新打开它,然后写入。或者,更好的是,编写一个临时文件并将其移动到原始文件之上(这会给你“原子”行为——不可能以半写文件结束)。

【讨论】:

  • 现在我已经按照你说的那样放了 f.seek(0) 但是我每次最后都有一些垃圾行 - 而不是前后有 50 行,然后我有 60 行..我不明白
  • @Novalink:当您在一个 12000 字节长的文件中寻找 0 时,然后写入 10000 字节,这会覆盖文件的前 10000 个字节,并留下其他 2000 个字节。你可以在写完之后使用f.truncate() 来解决这个问题。但同样,最好写入一个临时文件并将其移动到原始文件上,而不是尝试就地修改现有文件。
  • 重写的字节数是一样的
  • @Novalink:在你给我们的例子中,你用空字符串替换了每次出现的非空字符串,这意味着不可能可能相同的字节数。如果您有一个不同的示例,它的工作方式不同,请给我们一个 MCVE,我们可以调试那个。
  • 抱歉,我忘记了 - 后来替换了一个数字,但最初删除了一些字符串。无论如何,我在读写之间用“ open(filename,'w+') ”解决了(如何在cmets中格式化代码?
猜你喜欢
  • 2015-10-01
  • 2022-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多