【问题标题】:change character set for tempfile.NamedTemporaryFile更改 tempfile.NamedTemporaryFile 的字符集
【发布时间】:2012-09-13 10:08:32
【问题描述】:

我正在编写一个 python3 程序,该程序生成一个文本文件,该文件使用 asciidoc 进行后处理,用于 html 和 pdf 格式的最终​​报告。

python 程序会生成数千个带有图形的文件,以包含在最终报告中。文件的文件名使用 tempfile.NamedTemporaryFile

生成

tempfile使用的字符集定义为的问题:

字符 = "abcdefghijklmnopqrstuvwxyz0123456789_"

然后我以一些名称如“_6456_”的文件结尾,asciidoc 将“_”解释为格式并插入一些破坏报告的 html。

我需要找到一种方法来“转义” asciidoc 中的文件名或控制临时文件中的字符。

我当前的解决方案是在关闭临时文件后重命名临时文件,用其他字符替换“_”(不在临时文件用来避免冲突的字符列表中),但我觉得有一个更好的方法。

我会感激任何想法。我对python还不是很精通,我认为在tempfile中重载_RandomNameSequence会起作用,但我不知道该怎么做。

问候。

【问题讨论】:

    标签: python-3.x


    【解决方案1】:

    Hack 方式,基于操纵tempfile 内部:

    class MyRandomSequence(tempfile._RandomNameSequence):
        characters = "xyz123"
    
    tempfile._name_sequence = MyRandomSequence()
    # make your temporary file
    

    例子:

    >>> tempfile.NamedTemporaryFile()
    <open file '<fdopen>', mode 'w+b' at 0x1013b5540>
    >>> k=_
    >>> k.name
    '/var/folders/Su/SuMQtmxiE941sUwe8d91lE+++TU/-Tmp-/tmp33x22z'
    

    【讨论】:

    • 这是我的设想。谢谢。
    【解决方案2】:

    也许您可以使用 tempfile.tempdir 创建一个临时目录并手动生成文件名,例如 file1, file2, ..., filen 。这样您就可以轻松避免使用“_”字符,并且您可以在完成后删除临时目录。

    【讨论】:

    • 谢谢,这可能适用于单线程方案,但我需要 tempfile.NamedTemporaryFile 的保护措施以防止名称冲突。
    【解决方案3】:

    你为什么不自己创建一个生成器?

    例子:

    import string
    from random import choice
    
    def generate():
        size = 9
        return ''.join([choice(string.letters + string.digits) for i in range(size)])
    

    Source

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 2012-08-17
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多