【问题标题】:temp files/directories with custom names?具有自定义名称的临时文件/目录?
【发布时间】:2016-09-20 11:09:17
【问题描述】:

如何在 python 中使用用户定义的名称创建临时文件/目录。我知道 tempfile 。但是我看不到任何以文件名作为参数的函数。

注意:我需要这个来在包含临时文件的临时目录上对 glob(文件名模式匹配)功能进行单元测试,而不是使用实际的文件系统。

【问题讨论】:

  • 你知道tempfile.NamedTemporaryFile()函数吗?
  • 我认为它是随机命名文件的。有错请指正
  • 文件名可能是随机的,但既然你可以找出它是什么(result.name),你可以像普通文件一样重命名它。您还可以通过 dir= 参数控制创建它的目录。如果您不想在它关闭后立即删除它,请务必使用delete=True
  • 感谢您的建议。这有效
  • 仅供参考:os.rename(r'file path\OLD file name.file type',r'file path\NEW file name.file type')

标签: python pytest temporary-files python-unittest


【解决方案1】:

您可以将open() 与您需要的任何文件名一起使用。

例如

open(name, 'w')

Open

或者

import os
import tempfile

print 'Building a file name yourself:'
filename = '/tmp/guess_my_name.%s.txt' % os.getpid()
temp = open(filename, 'w+b')
try:
    print 'temp:', temp
    print 'temp.name:', temp.name
finally:
    temp.close()
    # Clean up the temporary file yourself
    os.remove(filename)

或者您可以使用mkdtemp 创建一个临时目录,然后使用open 在临时目录中创建一个文件。

【讨论】:

【解决方案2】:

我几乎更喜欢使用NamedTemporaryFile() 以这种复杂的方式编写,而不是使用open(),因为我真的想强调这是一个临时文件:

import tempfile, os

with tempfile.NamedTemporaryFile() as temp_fp:
    os.rename(temp_fp.name, '/tmp/my_custom_name.txt')
    # do stuff here ...

    # do stuff here END ...
    os.rename('/tmp/my_custom_name.txt', temp_fp.name) # finally, rename back
    

我们需要重新命名,因为: update file descriptor after os.rename()

【讨论】:

    【解决方案3】:

    如果您需要命名临时文件和目录,看起来您必须自己管理名称和/或创建/删除。

    但是,如果您只需要控制文件的名称,您可以使用tempfile.TemporaryDirectory() 创建一个临时目录,在该目录中创建您的命名文件,然后在脱离上下文时将其全部删除。

    像这样:

    with tempfile.TemporaryDirectory() as temp_dir:
        # open your files here
        named_file = open(os.path.join(temp_dir.name, "myname.txt"), 'w')
    
        # do what you want with file...
    
    # directory and files get automatically deleted here...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      相关资源
      最近更新 更多