Russell
Russell

Reputation: 2812

Removing a file with only the python file object

Let's say that I open a file, that didn't previously exist, for writing:

f = open('/tmp/test.txt', 'w')

Once this line is executed the file '/tmp/test.txt' is created. What is the cleanest way to remove (delete) the file with only the file object (f) and not the path?

Upvotes: 15

Views: 27450

Answers (4)

Austin Marshall
Austin Marshall

Reputation: 3107

Depending on your needs, you could also get away without creating a file at all. If all you need is a file-like object, most of the time you can use an instance of io.StringIO in place of a file. This can be useful to prevent unnecessary i/o operations.

>>> from io import StringIO
>>> f=StringIO()
>>> f.write(u'Hello, world!')
13
>>> f.seek(0)
0
>>> f.read()
u'Hello, world!'
>>> f.close()

Upvotes: 1

freakish
freakish

Reputation: 56467

Full answer:

f = open('/tmp/test.txt', 'w')
f.close()

os.remove(f.name)

You should close file before deleting (documentation says that it throws exception under Windows if the file is opened - didn't check this). f in your case is just a handle. It is not a file itself, so you can't delete it directly.

Upvotes: 11

AlG
AlG

Reputation: 15157

You can get the file name from the name member and delete as usual:

In [1]: f = open('/tmp/test.txt', 'w')

In [2]: f.name
Out[2]: '/tmp/test.txt'

Upvotes: 5

phihag
phihag

Reputation: 287835

You cannot remove a file handle, only a file path, since multiple paths can refer to the same file and some files (like sockets) don't even have paths. Therefore:

import os
f = open('/tmp/test.txt', 'w')
os.unlink(f.name)
# You can still use f here, it's just only visible for people having a handle.
# close it when you're finished.

However, you should not do that - there's a better way to solve your problem. Use the tempfile module which deletes the file automatically, or just write to /dev/null if you just need a file handle and don't care about the content being written.

Upvotes: 31

Related Questions