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


140

我有要在Python中删除的文本文件。我怎么做?


给出答案的人都说这是不可能的..那么您想告诉我如何轻松地在python中做到吗?
希克,2010年

Answers:


279

在python中:

open('file.txt', 'w').close()

或者,如果您已经打开了文件:

f = open('file.txt', 'r+')
f.truncate(0) # need '0' when using r+

在C ++中,您可以使用类似的东西。


#include<fstream>然后std::ofstream("file.txt");大约和Python一样短。:)
威廉希尔

8
之所以起作用(在C ++和python中都是如此),是因为默认情况下,当您打开文件进行写入时,它会截断现有内容。因此,实际上这确实是一个副作用,因此出于清楚的原因,我希望显式调用truncate(),尽管这是不必要的。
rmeador

7
如果使用“ r +”打开了文件,则如果已解析文件(可能已使用),则使用truncate(0)。将此添加到上面的答案即可完成!
Johan Engblom

3
使用f.seek(0)将指针移动到文件的开头
Johan Engblom

我既阅读又写文件。答案可以完美地将文件截断,但是请注意,如果要再次向文件中写入内容,请不要忘记在f.seek(0)之后添加f.truncate(0),否则您将在文件的开头添加奇怪的\ x00。
克里希纳·柴坦亚

29

不是完整的答案,更多是对ondra答案的扩展

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

一个简单的例子


21

以“写入”模式打开文件会清除该文件,您不必专门写入该文件:

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

(您应该关闭它,因为文件自动关闭的时间可能取决于实现方式)


10

用户@jamylak的另一种形式open("filename","w").close()

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

8

使用时with open("myfile.txt", "r+") as my_file:,在中会出现奇怪的零myfile.txt,尤其是因为我先读取文件时。为了使其正常工作,我首先必须使用来更改my_file文件开头的指针my_file.seek(0)。然后,我可以my_file.truncate()清除文件。


1
3年前在此答案中提到,不足为奇。
AMC

6

您必须覆盖文件。在C ++中:

#include <fstream>

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

1
无需close()通话。析构函数将关闭文件。因此,您只需要创建一个临时文件:ofstream("test.txt");
wilhelmtell

自从这个答案以来,这个问题已经改变了。鉴于问题的新方向,也许删除该问题?
Seanny123 '19

1

在程序中将文件指针分配为null只会摆脱对该文件的引用。该文件仍然存在。我认为remove()c中的功能stdio.h就是您在那儿寻找的。不确定Python。


2
顺便说一句,remove()和unlink()都会减少常规文件上的引用计数,而不是实际擦除它。一旦参考计数降至零,该文件将被删除。例如,如果您的进程打开了文件,并在其上调用unlink()或remove(),则在文件close()d之前,它不会被删除(即,引用计数降至零-也假定没有其他进程)打开文件)。例如,此行为很有用,以确保在异常进程终止后不会留下临时文件(例如,open(),unlink(),执行文件IO,CRASH和close()不会被调用)。
无效2010年

1

如果安全性对您很重要,那么打开文件进行写入并再次关闭将是不够的。至少某些信息仍将保留在存储设备上,例如可以通过使用光盘恢复实用程序找到。

例如,假设您要擦除的文件包含生产密码,并且需要在本操作完成后立即删除。

文件使用完毕后,请对其进行零填充,以确保敏感信息被销毁。

在最近的项目中,我们使用了以下代码,该代码非常适合小型文本文件。它用零行覆盖现有内容。

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)

请注意,零填充不能保证您的安全。如果您真的很担心,最好将其填充为零,使用File ShredderCCleaner等专业实用程序擦拭干净驱动器上的“空”空间。


0

除非需要擦除结尾,否则不能从就地文件“擦除”。要么满足于覆盖“空”值,要么阅读您关心的文件部分并将其写入另一个文件。


确定如何在不提供垃圾值的情况下覆盖它?我的意思是假设存在9的字符串长度,并且我用6的字符串长度覆盖了它。那将意味着3个垃圾值rt?
希克,2010年

正确。另外,您将必须具有某种方式来向任何读者识别这3个字符是垃圾的事实。
伊格纳西奥·巴斯克斯

事实是我的代码介于python和c ++之间。因此,如果一个文件的读取是在C ++和Python中文件写入做..两个文件具有时间被删除..
希克

0

由于文本文件是顺序文件,因此您不能直接删除它们上的数据。您的选择是:

  • 最常见的方法是创建一个新文件。从原始文件读取并将所有内容写入新文件,但要擦除的部分除外。写入所有文件后,删除旧文件并重命名新文件,使其具有原始名称。
  • 您也可以从要更改的位置开始截断并重写整个文件。试图指出要更改的地方,然后将其余文件读到内存中。找回同一点,截断文件,然后写回内容而没有要删除的部分。
  • 另一个简单的选择是用相同长度的另一个数据覆盖数据。为此,寻找确切位置并写入新数据。限制是它必须具有完全相同的长度。

查看seek/ truncatefunction / method以实现上述任何想法。Python和C都具有这些功能。


我只是想从一开始就删除整个文件
Hick,2010年

2
然后只需删除文件。在os.removeos.unlink在python中或unlink在C中使用。另一种选择是重新打开文件以进行写入或使用truncate
nosklo 2010年

0

写入和读取文件内容

def writeTempFile(text = ''):
    filePath = "/temp/file1.txt"
    if not text:                      # If blank 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

对我有用


0

您也可以使用此方法(基于上述一些答案):

file = open('filename.txt', 'w')
file.write('')
file.close

当然,这是清除文件的一种非常糟糕的方法,因为它需要很多行代码,但是我只是写了此文件,以向您展示它也可以用此方法完成。

祝您编码愉快!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.