Использование перенаправления Linux для перезаписи файла из скрипта Python - PullRequest
2 голосов
/ 17 августа 2010

У меня есть простой скрипт на python, который просто берет имя файла и выплевывает измененную версию этого файла.Я хотел бы перенаправить стандартный вывод (используя '>' из командной строки), чтобы я мог использовать свой сценарий для перезаписи файла с моими изменениями, например, python myScript.py test.txt > test.txt

Когда я это делаю, получаю тест.txt не содержит никакого текста из исходного test.txt - только дополнения, сделанные myScript.py.Однако, если я не перенаправляю стандартный вывод, тогда изменения получаются корректно.

Чтобы быть более конкретным, вот пример:


myScript.py:

#!/usr/bin/python
import sys

fileName = sys.argv[1]
sys.stderr.write('opening ' + fileName + '\n')

fileHandle = file(fileName)
currFile = fileHandle.read()
fileHandle.close()

sys.stdout.write('MODIFYING\n\n' + currFile + '\n\nMODIFIED!\n')

test.txt

Hello World

Результат python myScript.py test.txt > test.txt:

MODIFYING



MODIFIED!

Ответы [ 3 ]

7 голосов
/ 17 августа 2010

Причина, по которой он работает таким образом, заключается в том, что перед запуском Python Bash интерпретирует оператор перенаправления и открывает выходной поток для записи stdout в файл. Эта операция усекает файл до размера 0 - другими словами, он очищает содержимое файла. Таким образом, к моменту запуска скрипта Python он видит пустой входной файл.

Самое простое решение - перенаправить стандартный вывод в другой файл, а затем переименовать его в исходное имя файла.

python myScript.py test.txt > test.out && mv test.out test.txt

Кроме того, вы можете изменить свой скрипт Python, чтобы записать измененные данные обратно в сам файл, чтобы вам вообще не пришлось перенаправлять стандартный вывод.

1 голос
/ 17 августа 2010

Утилита sponge, присутствующая в пакете moreutils в Debian, может справиться с этим изящно.

python myScript.py test.txt | sponge test.txt

Как видно из его названия, sponge полностью истощит свой стандартный ввод перед открытием test.txt и записью полного содержимого stdin.

Вы можете получить последнюю версию губки здесь . Домашняя страница moreutils здесь .

1 голос
/ 17 августа 2010

Попробуйте перенаправить его в новый файл, оператор перенаправления, вероятно, удаляет файл непосредственно перед добавлением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...