Python - запись и чтение из временного файла

Я пытаюсь создать временный файл, который я пишу в некоторых строках из другого файла, а затем создаю некоторые объекты из данных. Я не уверен, как найти и открыть временный файл, чтобы я мог его прочитать. Мой код:

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()

По сути, я просто хочу сделать временный документ посредника для защиты от случайной перезаписи файла.

Ответ 1

В соответствии с 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)

Ответ 2

У вас проблема с областью; файл 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

Ответ 3

Если файл необходимо открыть во второй раз, например, прочитать другим процессом, это может вызвать проблемы в ОС Windows:

Возможность использования имени для открытия файла во второй раз, когда именованный временный файл все еще открыт, зависит от платформы (его можно использовать в Unix; в Windows NT или более поздней версии это невозможно).

Следовательно, безопасное решение - создать временный каталог, а затем вручную создать в нем файл:

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.