19

我正在使用以下方法创建一个 tmp 文件:

from tempfile import mkstemp

我正在尝试在此文件中写入:

tmp_file = mkstemp()
file = open(tmp_file, 'w')
file.write('TEST\n')

确实我关闭了文件并正确执行,但是当我尝试 cat tmp 文件时,它仍然是空的。它看起来很基本,但我不知道为什么它不起作用,有什么解释吗?

4

4 回答 4

34

smarx 的答案通过指定打开文件path。但是,它更容易指定fd。在这种情况下,上下文管理器会自动关闭文件描述符:

from tempfile import mkstemp

fd, path = mkstemp()

# use a context manager to open (and close) file descriptor fd (which points to path)
with fdopen(fd, 'w') as f:
    f.write('TEST\n')

# This causes the file descriptor to be closed automatically
于 2018-05-01T08:53:45.350 回答
26

mkstemp()返回一个带有文件描述符和路径的元组。我认为问题在于你写错了路。(您正在写入类似 的路径'(5, "/some/path")'。)您的代码应如下所示:

from tempfile import mkstemp

fd, path = mkstemp()

# use a context manager to open the file at that path and close it again
with open(path, 'w') as f:
    f.write('TEST\n')

# close the file descriptor
os.close(fd)
于 2016-07-18T12:52:45.967 回答
3

这个例子打开 Python 文件描述符os.fdopen来写很酷的东西,然后关闭它(在with上下文块的末尾)。其他非 Python 进程可以使用该文件。最后,文件被删除。

import os
from tempfile import mkstemp

fd, path = mkstemp()

with os.fdopen(fd, 'w') as fp:
    fp.write('cool stuff\n')

# Do something else with the file, e.g.
# os.system('cat ' + path)

# Delete the file
os.unlink(path)
于 2019-03-27T07:41:58.577 回答
2

mkstemp 返回 (fd, name) 其中 fd 是一个操作系统级别的文件描述符,准备好以二进制模式写入;所以你只需要使用os.write(fd, 'TEST\n'), 然后os.close(fd).

无需使用open或重新打开文件os.fdopen

jcomeau@bendergift:~$ python
Python 2.7.16 (default, Apr  6 2019, 01:42:57) 
[GCC 8.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> from tempfile import mkstemp
>>> fd, name = mkstemp()
>>> os.write(fd, 'TEST\n')
5
>>> print(name)
/tmp/tmpfUDArK
>>> os.close(fd)
>>> 
jcomeau@bendergift:~$ cat /tmp/tmpfUDArK 
TEST

当然,在命令行测试中,不需要使用os.close,因为无论如何文件在退出时都会关闭。但这是不好的编程习惯。

于 2021-07-08T00:28:36.460 回答