【问题标题】:Use a custom name for temporary file (tempfile module)为临时文件使用自定义名称(tempfile 模块)
【发布时间】:2021-09-25 13:46:26
【问题描述】:

我正在尝试生成包含一些基本 Python 样板代码的临时文件。我的大部分代码都在工作,但我似乎不知道如何使用 tempfile 模块为临时文件设置全名。

我的代码(如下)生成像 /tmp/210925_104246et5p5tgz.py 这样的文件名,其中第一部分 (210925_104246) 是我想用作名称的时间戳。它和.py (et5p5tgz) 之间的字符是由NamedTemporaryFile() 函数自动生成的,我不知道如何防止这种情况发生。


import tempfile
import datetime

boiler = b'''
import numpy as np
import matplotlib.pyplot as plt
from astropy.io import ascii


def main():
    """
    """


def func():
    """
    """

    return


if __name__ == '__main__':
    main()
'''


def createFile():
    """
    """
    pref = datetime.datetime.now().strftime("%y%m%d_%H%M%S")
    f = tempfile.NamedTemporaryFile(delete=False, suffix=".py", prefix=pref)
    filepath = f.name
    f.write(boiler)
    f.close()

    return filepath


filepath = createFile()
print(filepath)

【问题讨论】:

  • 创建一个临时目录并在其中创建非临时文件怎么样?
  • 嗯,如果可能的话,我更喜欢我的方法
  • 我没有看到这个问题及其答案。我想不可能用NamedTemporaryFile() 定义自定义名称然后
  • 挖掘源代码我发现了函数tempfile.gettempdir(),它在Linux上提供/tmp,可能它在Windows上提供了其他临时文件夹——所以你可以用它来创建跨平台代码。

标签: python temporary-files


【解决方案1】:

我确实浏览了Tempfile 的官方文档,我认为没有办法给它一个自定义名称(除了你已经使用过的前缀和后缀)。

但是,如果您正在寻找一种方法将样板代码存储在文件中,然后稍后在代码中检索它,您可以考虑使用 pickle,如下所示:

import tempfile
import datetime
import pickle
import os

boiler = b'''
import numpy as np
import matplotlib.pyplot as plt
from astropy.io import ascii


def main():
    """
    """


def func():
    """
    """

    return


if __name__ == '__main__':
    main()
'''

def createFile(bp_code):

    pref = datetime.datetime.now().strftime("%y%m%d_%H%M%S") + ".py"
#     f = tempfile.NamedTemporaryFile(delete=False, suffix=".py", prefix=pref)
#     filepath = f.name
    filedir = "d:\mycode"
    
    filename = os.path.join(filedir, pref)
    with open(filename, 'wb') as fh:
        pickle.dump(bp_code, fh)
        
    return filename

def getBoilerPlateCode(fpath):
    bp_code =""
    with open(fpath, 'rb') as fh:
        bp_code = pickle.load(fh)
    return bp_code.decode('utf-8')

filepath = createFile(boiler)
print(f"Filepath: {filepath}")

repeated_code = getBoilerPlateCode(filepath)
print(repeated_code)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-09
    • 2023-01-11
    • 1970-01-01
    • 2012-05-27
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多