在python中,在与另一个文件相同的目录中创建一个临时文件?

时间:2012-01-05 15:52:27

标签: python file temporary-files

我需要更新文件。我读了它,并写出来的变化。但是,我更喜欢写一个临时文件并将其重命名。

temp = tempfile.NamedTemporaryFile()
tempname = temp.name
temp.write(new_data)
temp.close()
os.rename(tempname, data_file_name)

问题是tempfile.NamedTemporaryFile()使/tmp中的临时文件成为不同的文件系统。这意味着os.rename()失败。如果我使用shlib.move()代替,那么我就不会进行原子更新" mv"提供(对于同一文件系统中的文件,yadda,yadda等)

我知道tempfile.NamedTemporaryFile()需要一个" dir"参数,但data_file_name可能是" foo.txt"在这种情况下,dir ='。&#39 ;;或data_file_name可能是" /path/to/the/data/foo.txt"在这种情况下,dir =" /path/to/the/data"。

我真正喜欢的是临时文件是data_file_name +"一些随机数据"。这样做的好处就是会以一种留下有用线索的方式失败。

建议?

5 个答案:

答案 0 :(得分:18)

您可以使用:

  • prefix使临时文件的名称与 原始文件。
  • dir指定放置临时文件的位置。
  • os.path.split从文件名中拆分目录。

import tempfile
import os
dirname, basename = os.path.split(filename)
temp = tempfile.NamedTemporaryFile(prefix=basename, dir=dirname)
print(temp.name)

答案 1 :(得分:4)

您可以在'dir'构造函数参数中传递文件位置。 它可以正常工作。

>>> t = tempfile.NamedTemporaryFile(dir="/Users/rafal")
>>> t.name
'/Users/rafal/tmplo45Js'

来源:http://docs.python.org/library/tempfile.html#tempfile.NamedTemporaryFile

答案 2 :(得分:4)

为了满足您的所有清单我认为您想要使用...

temp = tempfile.NamedTemporaryFile(prefix=data_file_name, dir=path,
                                   delete=False)

拥有delete=False很重要,否则:

  

[...]如果delete为true(默认值),则文件会立即删除   闭合。

答案 3 :(得分:2)

我将当前时间用作附加到基本字符串的“一些随机数据”以获取唯一的临时文件名:

import time

temp_file_name = data_file_name + str(time.time()) 

答案 4 :(得分:-1)

您使用的tempfile模块提供了一种管理临时文件的安全方法。如果你真的想要使用自己的系统,你应该意识到它可能容易受到攻击(特别是符号链接攻击)。

生成临时唯一文件名(虽然名称相当长)的简单方法是:

import uuid
import os

tempfilename = 'myprefix-%s.dat' % str(uuid.uuid4())

with open(tempfilename, 'rw') as tempfile:
    # do stuff

os.remove(tempfilename)

但这有点像黑客;非常考虑使用tempfile模块,并将正确的prefixdir参数传递给NamedTemporaryFile,如其他答案中所述。