如何在Python中清空文本文件的内容?

244

我有一个文本文件想要在Python中删除。该怎么做?


4
执行open('file.txt', 'w').close()看起来很奇怪,但是它是有效的。 - Charlie Parker
13个回答

472
在Python中:
open('file.txt', 'w').close()

或者,如果您已经打开了一个文件:
f = open('file.txt', 'r+')
f.truncate(0) # need '0' when using r+

#include<fstream>std::ofstream("file.txt");大致与Python中的长度相同。:) - wilhelmtell
14
这个方法之所以能够在C++和Python中都起作用,是因为默认情况下,当你打开一个文件进行写操作时,它会截断原有的内容。因此,这其实是一种副作用,因为清空文件内容并非该方法的主要目的。为了更明确地表达意思,尽管不必要,我仍然更喜欢显式地调用truncate()函数。 - rmeador
11
如果您使用“r+”打开文件,请使用truncate(0)进行截断,如果您已经解析了文件,那么您很可能已经这样做了。将此添加到上面的答案中以使其完整! - Johan Engblom
7
使用 f.seek(0) 将文件指针移动到文件开头。 - Johan Engblom
29
我既在读取文件,也在向其中写入内容。答案完美地截断了文件,但是请注意,如果您想再次向文件中写入内容,请不要忘记在 f.truncate(0) 后添加 f.seek(0),否则文件开头会出现奇怪的 \x00 字符。 - krishna chaitanya

45

以“写”模式打开文件会将其清空,您不必专门写入它:

open("filename", "w").close()

你应该关闭它,因为文件自动关闭的时间可能是实现特定的。


39

并非完整答案,更像是对ondra答案的扩展

在使用truncate()(我偏爱的方法)时,请确保光标位于所需位置。 当打开一个新文件进行读取 - open('FILE_NAME','r') 默认情况下其光标位置为0。 但如果您已经在代码中解析了该文件,请务必再次将其指向文件开头,即 truncate(0) 默认情况下,truncate() 从当前光标位置开始截断文件内容。

一个简单示例


这对我理解truncate()如何与光标位置相关工作非常有帮助。 - Frankstar

24

正如@jamylak所建议的那样,包括上下文管理器好处的一个很好的替代方案是:Benefits of context managers

with open('filename.txt', 'w'):
    pass

额外信息:使用“w”(写入)模式将自动截断/擦除文件内容(无需调用file.truncate(0))。为了更好地理解文件模式,请参考此流程图 - undefined

14
当使用 with open("myfile.txt", "r+") as my_file: 时,我在读取文件之前就在myfile.txt 中得到了奇怪的零值。为了使其正常工作,我必须先使用 my_file.seek(0) 将指针移动到文件的开头,然后才能使用my_file.truncate()清空文件。

2
这应该不会让人感到惊讶,因为3年前已经在这个答案中提到了。 - AMC

5
如果安全对你很重要,那么只打开文件写入并再次关闭文件是不够的。至少一些信息仍然存在于存储设备上,并且可以通过使用磁盘恢复工具找到它们。
例如,假设你要删除的文件包含生产密码,并且需要在当前操作完成后立即删除。
在完成使用文件后对其进行零填充有助于确保敏感信息被销毁。
在最近的一个项目中,我们使用了以下代码,适用于小型文本文件。它使用零行覆盖现有内容。
import os

def destroy_password_file(password_filename):
    with open(password_filename) as password_file:
        text = password_file.read()
    lentext = len(text)
    zero_fill_line_length = 40
    zero_fill = ['0' * zero_fill_line_length
                      for _
                      in range(lentext // zero_fill_line_length + 1)]
    zero_fill = os.linesep.join(zero_fill)
    with open(password_filename, 'w') as password_file:
        password_file.write(zero_fill)

请注意,用零填充不足以保证您的安全。如果您真的很关心安全性,最好使用专门的工具(如文件粉碎机CCleaner)来清除驱动器上的“空”空间。请保留HTML标记,只对内容进行翻译,不要添加解释。

4

文件内容的读写

def writeTempFile(text = None):
    filePath = "/temp/file1.txt"
    if not text:                      # If not provided return file content
        f = open(filePath, "r")
        slug = f.read()
        return slug
    else:
        f = open(filePath, "a") # Create a blank file
        f.seek(0)  # sets  point at the beginning of the file
        f.truncate()  # Clear previous content
        f.write(text) # Write file
        f.close() # Close file
        return text

这对我有效


3

您需要覆盖该文件。在C ++中:

#include <fstream>

std::ofstream("test.txt", std::ios::out).close();

1
不需要调用 close()。析构函数会关闭文件。所以你只需要创建一个临时的:ofstream("test.txt"); - wilhelmtell
这个问题自回答以来已经发生了变化。也许考虑删除该问题,因为问题的新方向? - Seanny123
这不是Python。 - AksLolCoding

3
您也可以使用以下方法(基于以上答案之一):
file = open('filename.txt', 'w')
file.close()

当然,这种清除文件的方法非常糟糕,因为它需要很多代码行,但我只是为了向你展示这种方法而编写的。

祝编码愉快!


0

这是我的方法:

  1. 使用 r+ 模式打开文件
  2. 使用 file.read() 从文件中读取当前数据
  3. 使用 file.seek(0) 将指针移动到第一行
  4. 使用 file.truncate(0) 从文件中删除旧数据
  5. 先写入新内容,然后写入我们保存的内容,使用 file.read()

所以完整代码看起来像这样:

with open(file_name, 'r+') as file:
   old_data = file.read()
   file.seek(0)
   file.truncate(0)

   file.write('my new content\n')
   file.write(old_data)

由于我们使用了with open,文件将会自动关闭。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接