【问题标题】:How to use tempfile.NamedTemporaryFile()?如何使用 tempfile.NamedTemporaryFile()?
【发布时间】:2012-06-18 02:13:25
【问题描述】:

我正在编写一个 Python 脚本,该脚本需要创建大约 50 个不同的临时文件,这些文件在脚本执行过程中经常被附加并在最后合并。我确信tempfile 模块可以满足我的需求,但我无法通过阅读文档了解如何操作。

我想使用临时文件(而不是变量)来节省系统内存,因为随着脚本处理数以万计的其他文件,这些数据块会变得越来越大。

以下代码块是我目前用来在非临时目录中(临时)创建这些文件的 hack:

item = (string from another file)   # string must id file for future use
tmpfile = 'tmpfiles/' + item
if item not in totalitems:
   totalitems.add(item)
   with open(tmpfile, 'w') as itemfile:
      output = some stuff
      tmpfile.write(output)
else:
   with open(tmpfile, 'a') as itemfile:
      output = different stuff
      tmpfile.write(output)

我想我需要的是tempfile.NamedTemporaryFile()。根据documentation

可以从文件对象的 name 成员中检索该名称。

很遗憾,我不明白这意味着什么。当我在我正在处理的文件中再次遇到相应的“项目”时,我只需要能够再次调用每个文件。我认为这是相当直截了当的,我只是很密集。万一这很重要,我有适用于 Python 2.7.1 和 3.2.3 的这个脚本的版本。我只需要一个或另一个工作;我创建这两个只是作为一个学习练习。

【问题讨论】:

  • @Joe,这个问题的一部分似乎与您链接的线程重复。部分不是;请参阅下面 Levon 答案下的评论。
  • 为什么需要命名这些文件?如果它们未命名(预先删除),则在清理方面出错的可能性较小。您可以简单地存储 tmpfile 对象,而不是其名称,然后调用 seek(0) 转到开头以准备读取...或映射其内容,或者以其他方式访问它。
  • @CharlesDuffy,你可能是对的,但我不明白。这是场景:在我正在处理的数据文件中重复出现 50 个“项目”(实际上是短字符串)。我创建了一个临时文件来从数据文件中收集有关这 50 项中的每一项的信息。我的问题是,当我在临时文件关闭后再次遇到该项目时,如何找到与特定“项目”相关的临时文件。
  • @pyrogerg "在它的临时文件被关闭之后"?为什么要关闭文件?

标签: python temporary-files


【解决方案1】:

“可以从文件对象的名称成员中检索到该名称。”

表示您可以像这样获取创建的临时文件的名称:

In [4]: import tempfile

In [5]: tf = tempfile.NamedTemporaryFile()  
In [6]: tf.name  # retrieve the name of the temp file just created
Out[6]: 'c:\\blabla\\locals~1\\temp\\tmptecp3i'

注意:默认情况下,文件在关闭时会被删除。但是,如果 delete 参数为 False,则不会自动删除该文件。有关详细信息,请参阅Python docs

由于您可以检索要创建的 50 个临时文件中的每一个的名称,因此您可以将它们保存在一个列表中,例如,在以后再次使用它们之前(如您所说)。请务必相应地设置 delete 值,以便文件在您关闭它们时不会消失(以防您打算关闭,然后再重新打开它们)。

我在这里Best way to generate random file names in Python详细解释了如何创建临时文件名

【讨论】:

  • 感谢您提供原始答案的链接。我仍然不确定如何将文件键入某个变量“item”的值。我想到了为此使用字典的想法。在您上面的代码中的第 5 行之后,这似乎合适吗? item_tmpfile={item:tf.name}。然后我可以稍后致电item_tmpfile[item]
  • @pyrogerg 是的,我认为这应该可行,您会将每个临时文件的名称与不同的item 相关联,其中item 将是稍后检索临时文件名的关键。我假设你的字典最终会有 50 个条目,对吧?您是否打算在两次使用之间关闭文件?如果是这样,请注意delete 参数。
  • 感谢delete 提示;我在您的原始答案中发现了这一点。我想我现在走在正确的轨道上。我想我可以在脚本过程中像使用其他任何文件一样使用这些文件,例如with open(item_tmpfiles[item]) as tf:?
  • @pyrogerg 你应该是,只需注意默认情况下临时文件是使用模式'w+b'创建的——只要你与你应该的模式一致,请参阅man page没事。可能最好运行一些简单的测试来确定。
  • @Lavon,我认为这会起作用,但我的字典中没有保留键有问题。这可能是另一个线程的问题。
猜你喜欢
  • 2011-04-24
  • 1970-01-01
  • 2012-09-13
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
相关资源
最近更新 更多