Matthew Lueder
Matthew Lueder

Reputation: 983

Python NamedTemporaryFile appears empty even after data is written

In Python 2 it was easy to create a temporary file and access it. However with in Python 3 it seems that is no longer the case. I'm confused on how I can get to the file I create with tempfile.NamedTemporaryFile() so I can call a command on it.

For example:

temp = tempfile.NamedTemporaryFile()
temp.write(someData)
subprocess.call(['cat', temp.name]) # Doesn't print anything out as if file was empty (would work in python 2)
subprocess.call(['cat', "%s%s" % (tempfile.gettempdir(), temp.name])) # Doesn't print anything out as if file was empty
temp.close()

Upvotes: 17

Views: 8618

Answers (2)

Matěj Račinský
Matěj Račinský

Reputation: 1804

The problem is seeking. The pointer related to the file points to the end of the file (so the next write would continue after what has been written previously, but that also means the read returns empty string). Seeking to position 0 fixes it.

with tempfile.NamedTemporaryFile('w+b') as target_f:
    target_f.write(b"abcde")
    target_f.seek(0)
    assert target_f.read() == b"abcde"

worked for me, the flushing did nothing.

Upvotes: 1

The problem is with flushing. The file output is buffered for efficiency reasons, so you must flush it for the changes to be actually written to the file. Additionally, you should wrap this into a with context manager instead of explicit .close()

with tempfile.NamedTemporaryFile() as temp:
    temp.write(someData)
    temp.flush()
    subprocess.call(['cat', temp.name])

Upvotes: 32

Related Questions