Самый короткий путь, вероятно, будет использовать модуль fileinput . Например, следующий код добавляет номера строк в файл на месте:
import fileinput
for line in fileinput.input("test.txt", inplace=True):
print('{} {}'.format(fileinput.filelineno(), line), end='') # for Python 3
# print "%d: %s" % (fileinput.filelineno(), line), # for Python 2
Что происходит здесь:
- Исходный файл перемещается в резервный файл
- Стандартный вывод перенаправляется в исходный файл в цикле
- Таким образом, любые
print
заявления записывают обратно в исходный файл
fileinput
имеет больше наворотов. Например, его можно использовать для автоматической работы со всеми файлами sys.args[1:]
, без необходимости явной итерации по ним. Начиная с Python 3.2, он также предоставляет удобный контекстный менеджер для использования в with
выражении.
Хотя fileinput
это отлично подходит для одноразовых скриптов, я бы с осторожностью использовал его в реальном коде, потому что, по общему признанию, он не очень читабелен или знаком. В реальном (производственном) коде стоит потратить всего несколько строк кода, чтобы сделать процесс явным и, следовательно, сделать код читабельным.
Есть два варианта:
- Файл не слишком большой, и вы можете просто прочитать его полностью в память. Затем закройте файл, снова откройте его в режиме записи и запишите измененное содержимое обратно.
- Файл слишком велик для хранения в памяти; Вы можете переместить его во временный файл и открыть его, читая его построчно, записывая обратно в исходный файл. Обратите внимание, что для этого требуется вдвое больше места.
file
скрывает предопределенный класс с тем же именем.