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