чтение и запись в python tempfile - PullRequest
0 голосов
/ 01 февраля 2019

У меня проблемы с чтением и записью в временный файл:

import tempfile

def edit(base):
    tmp = tempfile.NamedTemporaryFile(mode='w+')
    #fname = tmp.name
    tmp.write(base)
    #system('nano %s' % fname)
    content = tmp.readlines()
    tmp.close()
    return content

answer = "hi"
print(edit(answer))

Вывод [] вместо ["hi"] У меня нет причины,

Помощьценится

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Вы ошибаетесь из-за положения курсора.Когда вы пишете в файл, курсор останавливается в самом конце вашего текста.Тогда вы читаете, что ничего не значит.Поскольку курсор читает, данные идут после его позиции.Для быстрого исправления код должен быть таким:

import tempfile

def edit(base):
    tmp = tempfile.NamedTemporaryFile(mode='w+')
    #fname = tmp.name
    tmp.write(base)
    tmp.seek(0, 0)  # This will rewind the cursor
    #system('nano %s' % fname)
    content = tmp.readlines()
    tmp.close()
    return content

answer = "hi"
print(edit(answer))

Возможно, вы захотите прочитать документацию об этом.https://docs.python.org/3/tutorial/inputoutput.html?highlight=seek#methods-of-file-objects

0 голосов
/ 01 февраля 2019

Временные файлы - это все еще файлы;у них есть «указатель» на текущую позицию в файле.Для только что написанного файла указатель находится в конце последней записи, поэтому, если вы write без seek ing, вы читаете с конца файла и ничего не получаете.Просто добавьте:

tmp.seek(0)

после write, и вы поймете, что вы написали в следующем read / readlines.

Если цель состоит только в том, чтобы сделатьданные, видимые для чего-то другого, открывающего файл по имени, например, внешняя программа, такая как nano в вашем закомментированном коде, вы можете пропустить seek, но вам нужно убедиться, что данные сброшены из буфера на диск,поэтому в тот же момент после write вы добавите:

tmp.flush()
...