2016-10-11 2 views
4

Я пытаюсь создать временный файл, который я пишу в некоторых строках из другого файла, а затем создаю некоторые объекты из данных. Я не уверен, как найти и открыть временный файл, чтобы я мог его прочитать. Мой код: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() 

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

+0

Я никогда не использовал временные файлы, есть какая-либо причина вы arn't используя стандартный 'Open()' '' write' и read' методы? – kpie

+0

Я хочу защитить от возможности, что имя файла уже существует, и я мог бы перезаписать его –

+0

1. Считаете ли вы, что вы просто проложили вывод из одного сценария во вход второго скрипта? 2. Проверяете ли вы, что временный файл существует на пути, который вы ищете? – erapert

ответ

6

Согласно 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) 
+0

Спасибо, что решили. Что делает .seek (0)? –

+0

- это перемотка, о которой вы говорите? –

+2

После 'tmp.writelines' указатель файла находится в конце файла. 'tmp.seek (0)' снова возвращает его в начало (перематывает его - возможно, это древняя кассета-лента!), чтобы вы могли прочитать написанное. – tdelaney

5

У вас проблема с прицелом; файл 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 
+0

Также убедитесь, что вы добавили «f.seek (0)» после записи в файл, если вы собираетесь читать его, не закрывая и не открывая его. В противном случае вы будете читать конец файла, который даст неверный результат. – jelde015

Смежные вопросы