Reputation: 36414
I have text file which I want to erase in Python. How do I do that?
Upvotes: 252
Views: 589091
Reputation: 9351
In Python:
open('file.txt', 'w').close()
Or alternatively, if you have already an opened file:
f = open('file.txt', 'r+')
f.truncate(0) # need '0' when using r+
Upvotes: 486
Reputation: 351
Writing and Reading file content
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
Upvotes: 6
Reputation: 139
You can also use this (based on a few of the above answers):
file = open('filename.txt', 'w')
file.close()
of course this is a really bad way to clear a file because it requires so many lines of code, but I just wrote this to show you that it can be done in this method too.
Upvotes: 3
Reputation: 669
As @jamylak suggested, a good alternative that includes the benefits of context managers is:
with open('filename.txt', 'w'):
pass
Upvotes: 24
Reputation: 1684
If security is important to you then opening the file for writing and closing it again will not be enough. At least some of the information will still be on the storage device and could be found, for example, by using a disc recovery utility.
Suppose, for example, the file you're erasing contains production passwords and needs to be deleted immediately after the present operation is complete.
Zero-filling the file once you've finished using it helps ensure the sensitive information is destroyed.
On a recent project we used the following code, which works well for small text files. It overwrites the existing contents with lines of zeros.
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)
Note that zero-filling will not guarantee your security. If you're really concerned, you'd be best to zero-fill and use a specialist utility like File Shredder or CCleaner to wipe clean the 'empty' space on your drive.
Upvotes: 5
Reputation: 53285
Opening a file in "write" mode clears it, you don't specifically have to write to it:
open("filename", "w").close()
(you should close it as the timing of when the file gets closed automatically may be implementation specific)
Upvotes: 46
Reputation: 4226
When using with open("myfile.txt", "r+") as my_file:
, I get strange zeros in myfile.txt
, especially since I am reading the file first. For it to work, I had to first change the pointer of my_file
to the beginning of the file with my_file.seek(0)
. Then I could do my_file.truncate()
to clear the file.
Upvotes: 14
Reputation: 887
Not a complete answer more of an extension to ondra's answer
When using truncate()
( my preferred method ) make sure your cursor is at the required position.
When a new file is opened for reading - open('FILE_NAME','r')
it's cursor is at 0 by default.
But if you have parsed the file within your code, make sure to point at the beginning of the file again i.e truncate(0)
By default truncate()
truncates the contents of a file starting from the current cusror position.
Upvotes: 39
Reputation: 15136
You have to overwrite the file. In C++:
#include <fstream>
std::ofstream("test.txt", std::ios::out).close();
Upvotes: 3
Reputation: 223152
Since text files are sequential, you can't directly erase data on them. Your options are:
Look at the seek
/truncate
function/method to implement any of the ideas above. Both Python and C have those functions.
Upvotes: 0
Reputation: 1018
Assigning the file pointer to null inside your program will just get rid of that reference to the file. The file's still there. I think the remove()
function in the c stdio.h
is what you're looking for there. Not sure about Python.
Upvotes: 1
Reputation: 799490
You cannot "erase" from a file in-place unless you need to erase the end. Either be content with an overwrite of an "empty" value, or read the parts of the file you care about and write it to another file.
Upvotes: 0