Найкоротшим способом, ймовірно, було б використання модуля 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
це затінення попередньо визначеного однойменного класу.