Почему запись текста в файл работает только при звонке с терминала? - PullRequest
0 голосов
/ 11 мая 2019

Я получил этот простой код на Python, который записывает «abc» в текстовый файл, вызывая test.txt.Теперь, когда Raspberry выполняет этот код с IDLE или Thonny НЕ работает, текстовый файл остается пустым ... но вместо этого, при вызове с терминала, он записывает текст в файл.Может кто-нибудь помочь?

f = open("test.txt","w") 
f.write("abc")

Ответы [ 4 ]

4 голосов
/ 11 мая 2019

Запись файлов буфера Python по умолчанию. Это делается для повышения производительности.Каждый раз, когда Python записывает в файл (или управляемый ОС поток ввода-вывода, например STDOUT), он должен приостанавливать выполнение и передавать управление ОС.Если ОС занята чем-то другим или если диск, на который вы хотите записать свои данные, занят чем-то другим, вы можете долго ждать ответа.Вместо того, чтобы ждать каждый раз, когда вы хотите что-то записать, Python записывает данные в буфер в памяти, а затем обещает в конечном итоге записать содержимое буфера в файл, как только буфер заполнится (процесс, называемый «очистка» буфера).Это позволяет немедленно продолжить выполнение вашей программы.

При использовании буферов записи существует риск того, что если ваша программа выйдет из строя до того, как буфер будет записан на диск, вы потеряете эти данные.Кроме того, если одна программа выполняет запись в буфер и продолжает выполнение таким образом, нет гарантии, что одновременно работающая программа увидит эти данные на диске до тех пор, пока первая программа каким-либо образом не очистит буфер.Этот второй сценарий является тем, что происходит в вашем примере: IDLE запускает один процесс Python, который записывает в буфер, и вы запускаете второй параллельный процесс для проверки файла, пока IDLE все еще работает.Поскольку буфер не был очищен в IDLE, вы не увидите ничего написанного.Этого не происходит, когда вы запускаете программу из терминала, потому что там завершается процесс Python, и одна из задач очистки, выполняемых при завершении процесса, состоит в очистке всех буферов записи.

Есть много способовзаставить очистить буфер. Python автоматически сбрасывает буферы записи при закрытии файлов , поэтому вы можете попробовать:

f = open("test.txt", "w")
f.write("abc")
f.close()

Предпочтительный способ открывать файлы в Python - использовать менеджер контекста оператора with.Когда выполнение выходит из блока with, переменные, созданные в операторе with, должны очистить себя, что в случае файлов означает их закрытие.Итак, вы можете попробовать:

with open("test.txt", "w") as f:
    f.write("abc")  # after this block, f is flushed and closed

Если вы хотите оставить файл открытым и вручную очистить буфер записи, Python предоставляет вам метод flush , так что вы также можете написать:

f = open("test.txt", "w")
f.write("abc")
f.flush()  # f remains open

Наконец, вы можете указать Python использовать буфер, размер которого отличается от размера по умолчанию операционной системы, передав аргумент buffering в open.Значение 0 указывает Python немедленно сбрасывать каждую запись на диск.Чтобы вы могли сделать это:

f = open("test.txt", "w", buffering=0)
f.write("abc")  # f remains open
2 голосов
/ 11 мая 2019

Лучшая практика написания файлов - использование with, оно автоматически закроет и выпустит ваш файл.

with open("test.txt","w") as f:
    f.write("abc")
1 голос
/ 11 мая 2019

попытаться вызвать f.close () в конце вашего кода?

0 голосов
/ 11 мая 2019

Когда вы явно открываете файл, делая

f = open("test.txt","w") 
f.write("abc")

Необходимо убедиться, что вы закрываете файл в конце, выполнив f.close(), иначе данные, которые вы записали в файл, не будут сброшены в файл, не имеет значения, где вы запускаете код от, поэтому код будет

f = open("test.txt","w") 
f.write("abc")
#Close the file
f.close()

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

with open("test.txt","w") as f:
    f.write("abc")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...