Якщо довжина нового рядка не збігається з довжиною старої, то доведеться переписати весь файл (починаючи з рядка, яку ви хочете замінити) навіть якщо вам треба замінити тільки один рядок в файлі (за рідкісними винятками). Пов'язаний питання: Запис текстового рядка за потрібною індексу в файл на мові Сі?
Можна самостійно явно тимчасовий файл створити:
Відмінність в тому, що оригінальне вміст зберігається в .bak файлі в fileinput підході, а в коді з NamedTemporaryFile вихідний файл замінюється лише в разі успіху (у відсутності виключень).
Невеликий файл можна в пам'ять цілком завантажити, щоб отримати список рядків, змінити потрібні і цілком перезаписати цей файл, ризикуючи втратити дані якщо помилка виникне під час запису (аналогічно коду в @stxdtm відповіді):
Якщо довжина нового рядка збігається з довжиною старої (в байтах), то можна прямо за місцем зміни робити не переписуючи інші частини файлу, наприклад, використовуючи mmap модуль, який дозволяє файл розглядати і як файл (.readline (). Etc) і як байтовую рядок (.find (). можна застосовувати регулярні вирази). Пов'язаний питання: Python - How can I change bytes in a file.
Відкрити файл на читання можна або так
Перевага другого способу в тому, що вам не треба закривати файл вручну. Конструкція with зробить це за вас після закриття її блоку.
Перезаписати файл можна ж таким чином:
Але так як ви хочете писати файл із заміною рядки, то вам потрібно скористатися перебором по readlines () і або регулярними виразами, або порівнянням поточного рядка з тієї, яку ви шукайте (якщо у вас є шукана стрічка, звичайно) і її заміною.
Грубо кажучи, ви можете зробити це якось так:
Також можуть допомогти функції startswith () і endswith (). якщо у вас є тільки початок або кінець від шуканої рядка. І пам'ятайте про регістр!
Також враховуйте, що replace () зробить заміну навіть якщо рядок частково збігається. Тобто виконавши це:
Ми отримаємо Thwas was a simple example