Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delete the contents of a file before writing to it (in Python)?

I'm trying my hand at this rosalind problem and am running into an issue. I believe everything in my code is correct but it obviously isn't as it's not running as intended. i want to delete the contents of the file and then write some text to that file. The program writes the text that I want it to, but it doesn't first delete the initial contents.

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)

I've seen:

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

But my problem still persists. What am I doing wrong?

like image 430
Tare Gaskin Avatar asked Jan 28 '17 21:01

Tare Gaskin


People also ask

How do you clear a text file and write it in Python?

Clear a Text File Using the open() Function in write Mode Opening a file in write mode clears its data. Also, if the file specified doesn't exist, Python will create a new one. The simplest way to delete a file is to use open() and assign it to a new variable in write mode.

How do you remove text from a text file in Python?

Method 3: Delete a particular data from the file This can be done by following ways: Open file in read mode, get all the data from the file. Reopen the file again in write mode and write all data back, except the data to be deleted.

How do I delete an open file in Python?

In Python, you can use the os. remove() method to remove files, and the os. rmdir() method to delete an empty folder.

How do you remove words from a file in Python?

By using replace() method, you can delete a phrase or text from a file.


2 Answers

truncate() truncates at the current position. Per its documentation, emphasis added:

Resize the stream to the given size in bytes (or the current position if size is not specified).

After a read(), the current position is the end of the file. If you want to truncate and rewrite with that same file handle, you need to perform a seek(0) to move back to the beginning.

Thus:

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

(You could also have passed raw.truncate(0), but this would have left the pointer -- and thus the location for future writes -- at a position other than the start of the file, making your file sparse when you started writing to it at that position).

like image 181
Charles Duffy Avatar answered Oct 11 '22 01:10

Charles Duffy


If you want to completley overwrite the old data in the file, you should use another mode to open the file.

It should be:

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

To resolve your problem, First read the file's contents:

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

And then open it using the write mode.This way, you will not append your text to the file, you'll just write only your data to it.

Read about mode files here.

like image 34
Ofer Arial Avatar answered Oct 11 '22 01:10

Ofer Arial