在写入文件之前删除文件的内容(在 Python 中)?

Posted

技术标签:

【中文标题】在写入文件之前删除文件的内容(在 Python 中)?【英文标题】:Delete the contents of a file before writing to it (in Python)? 【发布时间】:2017-06-14 09:13:42 【问题描述】:

我正在尝试使用 this rosalind problem 并遇到问题。我相信我的代码中的所有内容都是正确的,但显然不是因为它没有按预期运行。我想删除文件的内容,然后将一些文本写入该文件。该程序写入我想要的文本,但它不会首先删除初始内容。

def ini5(file):
raw = open(file, "r+")
raw2 = (raw.read()).split("\n")
clean = raw2[1::2]
raw.truncate()
for line in clean:
    raw.write(line)
    print(line)

我见过:

How to delete the contents of a file before writing into it in a python script?

但我的问题仍然存在。我做错了什么?

【问题讨论】:

顺便说一句,这不是一个好的做法——最好为输出创建一个单独的临时文件,并在完成后将其重命名为原始文件;这样,如果您的程序无法完成,您就不会破坏您的输入文件,并且同时运行的系统上的其他进程始终可以访问一个版本或另一个版本,无论是原始表单还是更新表单。 【参考方案1】:

truncate()当前位置截断。根据其文档,重点补充说:

将流的大小调整为以字节为单位的给定大小(如果未指定大小,则为当前位置)

read() 之后,当前位置是文件的结尾。如果您想使用相同的文件句柄进行截断和重写,则需要执行 seek(0) 以返回到开头。

因此:

raw = open(file, "r+")
contents = raw.read().split("\n")
raw.seek(0)                        # <- This is the missing piece
raw.truncate()
raw.write('New contents\n')

(您也可以通过raw.truncate(0),但这会将指针(以及将来写入的位置)留在文件开头以外的位置,从而在您开始写入时使文件稀疏到那个位置)。

【讨论】:

这真的很有帮助,很少有指南提到截断使光标不在文件开头 我认为seekwritetruncate 可能更有效。 @Yay295, ...取决于您的文件系统;并非每个文件系统都进行就地写入实际上直接修改数据块。日志数据是一回事。另一个问题是失败案例是什么样的。对于进行取证或恢复的人来说,被截断的数据比被半覆盖的数据更明显(恕我直言),所以如果可以选择,我更喜欢它作为故障模式。【参考方案2】:

如果你想完全覆盖文件中的旧数据,你应该使用另一个mode打开文件。

应该是:

raw = open(file, "w") # or "wb"

要解决您的问题,请先阅读文件内容:

with open(file, "r") as f: # or "rb"
    file_data = f.read()
# And then:
raw = open(file, "w")

然后使用write 模式打开它。这样,您不会将文本附加到文件中,而只会将数据写入其中。

阅读模式文件here。

【讨论】:

OP 想要在覆盖之前执行读取——否则,是的,他们只会使用w,但它不适合那个目的。如果您建议他们关闭读取句柄然后创建第二个写入句柄,这是可行的,但您可能会更明确。 为简单起见点赞。如果可以避免,我会避免打开读/写句柄。虽然我怀疑重复使用同一个句柄会更快。 好的,所以我让它按照我想要的方式运行。感谢大家!不过要澄清一下——要提取内容(如字符串信息),我必须以读取模式打开文件,但是要编辑实际文件,我必须以写入模式打开它。为此,我必须以读取模式打开文件,然后以写入模式打开文件(不使用“r+”)? 不完全是,你可以使用“r+”。在您的特定情况下,两者都很好。只是为了简单起见将它们分开。 @TareGaskin, r+ 当然有效——我的回答描述了如何在你写之前截断并返回到文件的开头。因此,您有两种选择,有两种不同的行为——哪一种更合适取决于您的用例。打开一个单独的文件句柄意味着如果目录条目从您下面更改出来,您可能会得到一个不同的 inode 来写入而不是读取,因此这是两个非常不同的解决方案,每个都有自己的语义。

以上是关于在写入文件之前删除文件的内容(在 Python 中)?的主要内容,如果未能解决你的问题,请参考以下文章

python txt文件的写入和读取

Python对 txt 文件进行读写清除和删除操作

使用 Python 写入文件 [重复]

在python中删除特定内容并输出到文件

python文件读写

Python file重复写入之前的内容不被后写入的覆盖