【问题标题】:python tempfile: how to open several times the temp file?python tempfile:如何多次打开临时文件?
【发布时间】:2013-07-06 11:57:03
【问题描述】:

我正在尝试使用 tempfile 模块。 (http://docs.python.org/2.7/library/tempfile.html) 我正在寻找一个临时文件,我可以打开多次以获取多个流来读取它。

tmp = ...
stream1 = # get a stream for the temp file
stream2 = # get another stream for the temp file

我已经尝试了几个函数(TemporaryFile、NamedTemporaryFile、SpooledTemporaryFile)并使用了 fileno 方法左右,但我无法执行我正在寻找的。​​p>

知道我应该自己开课吗?

谢谢

> 更新

尝试打开文件时出错...

In [2]: t = tempfile.NamedTemporaryFile()
In [3]: t.write('abcdef'*1000000)
In [4]: t.name
Out[4]: 'c:\\users\\mike\\appdata\\local\\temp\\tmpczggbt'
In [5]: f = open(t.name)
---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-6-03b9332531d2> in <module>()
----> 1 f = open(t.name)

IOError: [Errno 13] Permission denied: 'c:\\users\\mike\\appdata\\local\\temp\\tmpczggbt'

【问题讨论】:

  • 这听起来像XY problem;你到底想在这里做什么?
  • 我想要做的是:我获取一个 URL,如果它太大而不是字符串变量,我想将数据存储在一个临时文件中。然后我想从几个地方读取它,但不想使用相同的流。当我使用一个字符串时,我可以从这个字符串创建几个 StringIO 而不复制数据,我正在寻找相同的行为来获取多个流。

标签: python temporary-files


【解决方案1】:

如果不将文件位置重新定位到开头,则无法多次读取文件对象(无论它们是临时的还是其他)。

您的选择是:

  • 要多次重新打开文件,为同一个文件创建多个文件对象。
  • 在每次读取前回退文件对象。

要重新打开文件,请使用NamedTemporaryFile 并使用常规的open() 调用多次重新打开相同的文件名。您可能希望将 delete=False 传递给构造函数,尤其是在 Windows 上,以便能够执行此操作。

要倒带,请在文件对象上调用.seek(0)

【讨论】:

  • 我尝试使用名称打开它,但出现“权限被拒绝”错误...查看我的问题的更新。
  • @YAmikep:在创建NamedTemporaryFile时设置delete=False
  • 好的,谢谢。我想现在我必须小心翼翼地自己删除文件。另一件事,我喜欢 SpooledTemporaryFile 的想法,但它不需要删除参数,我想当我想将数据保存在内存中然后在需要时使用 NamedTemporaryFile 时我需要自己处理?无法使 SpooledTemporaryFile 以相同的方式工作,以便在创建文件后多次重新打开。
  • 您不能使用SpooledTemporaryFile 执行此操作,因为它在滚动到磁盘时在内部使用TemporaryFile() 对象。在 Windows 上 碰巧NamedTemporaryFile 是同一类(实际上是别名),但 delete=True 将默认设置且不可覆盖。
  • 在这种情况下,您可以尝试从python source code 编写自己的克隆并调整它以返回带有delete=FalseNamedTemporaryFile
【解决方案2】:

您可以使用tempfile.mkstemp()。来自文档:

以最安全的方式创建一个临时文件。假设平台正确实现了 os.open() 的 os.O_EXCL 标志,则文件创建中没有竞争条件。该文件只能由创建用户 ID 读写。如果平台使用权限位来指示文件是否可执行,则该文件不能被任何人执行。文件描述符不被子进程继承。

与 TemporaryFile() 不同,mkstemp() 的用户负责删除完成后的临时文件。

然后您可以使用open() 内置函数多次创建和打开该文件。完成后记得删除文件,因为这不会自动完成。

【讨论】:

    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    相关资源
    最近更新 更多