Python - 从临时文件中写入和读取

时间:2016-10-11 18:11:46

标签: python temporary-files

我正在尝试创建一个临时文件,我在另一个文件的某些行中编写,然后从数据中创建一些对象。我不知道如何找到并打开临时文件,以便我可以阅读它。我的代码:

with tempfile.TemporaryFile() as tmp:
    lines = open(file1).readlines()
    tmp.writelines(lines[2:-1])

dependencyList = []

for line in tmp:
    groupId = textwrap.dedent(line.split(':')[0])
    artifactId = line.split(':')[1]
    version = line.split(':')[3]
    scope = str.strip(line.split(':')[4])
    dependencyObject = depenObj(groupId, artifactId, version, scope)
    dependencyList.append(dependencyObject)
tmp.close()

基本上我只想制作一个中间人临时文件,以防止意外覆盖文件。

3 个答案:

答案 0 :(得分:17)

根据docs,当TemporaryFile关闭时,文件将被删除,退出with子句时会发生这种情况。所以......不要退出with条款。回滚文件并在with中完成工作。

with tempfile.TemporaryFile() as tmp:
    lines = open(file1).readlines()
    tmp.writelines(lines[2:-1])
    tmp.seek(0)

    for line in tmp:
        groupId = textwrap.dedent(line.split(':')[0])
        artifactId = line.split(':')[1]
        version = line.split(':')[3]
        scope = str.strip(line.split(':')[4])
        dependencyObject = depenObj(groupId, artifactId, version, scope)
        dependencyList.append(dependencyObject)

答案 1 :(得分:16)

你有范围问题;文件tmp仅存在于创建它的with语句的范围内。此外,如果您希望稍后在初始NamedTemporaryFile之外访问该文件,则需要使用with(这使操作系统能够访问该文件)。此外,我不确定您为什么要尝试附加到临时文件...因为它在您实例化之前不会存在。

试试这个:

import tempfile

tmp = tempfile.NamedTemporaryFile()

# Open the file for writing.
with open(tmp.name, 'w') as f:
    f.write(stuff) # where `stuff` is, y'know... stuff to write (a string)

...

# Open the file for reading.
with open(tmp.name) as f:
    for line in f:
        ... # more things here

答案 2 :(得分:0)

如果文件需要第二次打开,例如might cause trouble on Windows OS通过不同的过程读取:

  

该名称是否可用于第二次打开文件,而命名的临时文件仍处于打开状态,在不同的平台上会有所不同(在Unix上可以使用,在Windows NT或更高版本上不能使用)。

因此,安全的解决方案是改为create a temporary directory,然后在其中手动创建文件:

import os.path
import tempfile

with tempfile.TemporaryDirectory() as td:
    f_name = os.path.join(td, 'test')
    with open(f_name, 'w') as fh:
        fh.write('<content>')
    # Now the file is written and closed and can be used for reading.