Where does python tempfile writes its files?
Looking at .name
on a file handle is indeed one way to see where the file exists. In the case of TemporaryFile
(on *NIX systems), you'll see <fdopen>
, indicating an open file handle, but no corresponding directory entry. You'll need to use NamedTemporaryFile
if you'd like to preserve the link to the underlying file.
If you wish to control where temporary files go, look at the dir
parameter:
TemporaryFile
uses mkstemp
, which allows setting the directory with the dir
parameter:
If
dir
is specified, the file will be created in that directory; otherwise, a default directory is used. The default directory is chosen from a platform-dependent list, but the user of the application can control the directory location by setting theTMPDIR
,TEMP
orTMP
environment variables.
Is it possible to get the path of a tempfile in Python 3
Use tempfile.NamedTemporaryFile
to create a temporary file with a name, and then use the .name
attribute of the object.
Note that there are platform-specific limitations on how this name can be used. The documentation says:
Whether the name can be used to open the file a second time, while the named temporary file is still open, varies across platforms (it can be so used on Unix; it cannot on Windows NT or later).
Python - writing and reading from a temporary file
As per the docs, the file is deleted when the TemporaryFile
is closed and that happens when you exit the with
clause. So... don't exit the with
clause. Rewind the file and do your work in the with
.
with tempfile.TemporaryFile() as tmp:
lines = open(file1).readlines()
tmp.writelines(lines[2:-1])
tmp.seek(0)
for line in tmp:
groupId = textwrap.dedent(line.split(':')[0])
artifactId = line.split(':')[1]
version = line.split(':')[3]
scope = str.strip(line.split(':')[4])
dependencyObject = depenObj(groupId, artifactId, version, scope)
dependencyList.append(dependencyObject)
Why am I able to write to and read a tempfile even after closing it?
Lets have a deeper look at your code.
First you create your temp file
f = tempfile.NamedTemporaryFile(mode='w+t', delete=True)
n = f.name
print('Does exist? : {0}'.format(os.path.exists(n)))
and this output
Does exist? : True
so there is nothing to worry about. Then in the next statements
f.close()
print('Does exist? : {0}'.format(os.path.exists(n)))
you are closing the file and actually the file gets deleted, because you are getting the following output:
Does exist? : False
Afterwards however you are recreating your file via
subprocess.run(['nano', n])
with open(n) as f:
print (f.read())
so this is why afterwards the command
print('Does exist? : {0}'.format(os.path.exists(n)))
returns
Does exist? : True
How to select the disk location for UploadFile parameter in FastAPI?
You could use Python's tempfile module to get, as well as change, the default temporary
directory. Example:
import tempfile
print("Temp directory before change:", tempfile.gettempdir())
tempfile.tempdir = "path/to/tempdir/here"
print("Temp directory after change:", tempfile.gettempdir())
Passing a temporary file created with Python's tempfile to a command line program ignoring line ending preferences
I wanted to thank everyone who tried to help. The comments helped me discover another vulnerability elsewhere in my code. The problem ended up actually not being my own, rather it was the service I was using
Tempfile not found when finishing function
TemporaryFile
does not return a valid filedescriptor when asked for the name attribute. You can use NamedTemporaryFile
to ask for the name.
from flask import send_file
import tempfile
import csv
@app.route('/download')
def download():
with tempfile.NamedTemporaryFile(mode='w', newline='', dir='.', suffix='.csv') as csvfilenew:
writer = csv.writer(csvfilenew, delimiter= ';')
writer.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
csvfilenew.flush()
csvfilenew.seek(0)
return send_file(csvfilenew.name,
as_attachment=True,
attachment_filename='cleanfile.csv'
)
Another simple workaround for small amounts of data is as follows:
from flask import send_file
import csv
import io
@app.route('/download')
def download():
with io.StringIO() as doc:
writer = csv.writer(doc, delimiter= ';')
writer.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
doc.seek(0)
return send_file(io.BytesIO(doc.read().encode('utf8')),
as_attachment=True,
attachment_filename='cleanfile.csv'
)
Related Topics
Python Gdal 2.1 Installation on Ubuntu 16.04
Get Local Network Interface Addresses Using Only Proc
How Does Collections.Defaultdict Work
Find Nearest Value in Numpy Array
How to Delete a File or Folder in Python
How to "Watch" a File for Modification/Change
How to Get the Last Day of the Month
Loop Through All Nested Dictionary Values
How to Convert Seconds to Hours, Minutes and Seconds
Change Working Directory in Shell with a Python Script
Total Memory Used by Python Process
How to Modify Lines in a File In-Place
CSS Not Loading Wrong Mime Type Django
How to Push a Subprocess.Call() Output to Terminal and File
How to Plot Multiple Dataframes in Subplots
Google App Engine: Won't Serve Static Assets with Below Error: