How to Replace String in File Using Python
File handling is ansesential aspect of any web application. Python, подібний до інших програмних мов, supports file handling. Це дозволяє програмісти до робіт з файлами і істотно реалізувати деякі основні операції як reading, writing, і деякі інші файли handling options to operate on files.
Open () функція може бути використана для Open file в Python program. Файл може бути відкритий в одному тексті або binary mode, який використовується для користувача. The open() функція має several modes, all of which provide different accessibility options for file to be opened in.
Термін string в Python може бути зображений як cluster Unicode characteris closed within single or double quotes. Strings може бути розташований всередині текстових файлів, які будуть відкрити в Python code.
Цей літературу буде говорити про різні методи, щоб відредагувати string в файлі в Python.
Use the replace() Function When Input and Output Files Are Different
метод () метод в Python є використаний для пошуку для sub-string і replace it з іншим sub-string.
The replace() функція має три параметри, особливо oldvalue , newvalue , and count . При цьому oldvalue and newvalue є необхідними значеннями, і забезпечує функцію з count parameter is optional.
Під час наступного коду використовується опція() функція до заміни string в Python, коли вхід і випуск файлів є різним.
# the input file
fin =
open("f1.txt", "rt")
# the output file which stores result
fout =
open("f2.txt", "wt")
# iteration for each line in the input file
for line in fin:
# replacing the string and write to output file
fout.write(line.replace("gode", "God"))
# closing the input and output files
fin.close()
fout.close()
У виході з вищезазначеного коду, string gode в файлі буде replaced by word God .
В обох кодах, ми одночасно працює на двох різних файлах, f1.txt і f2.txt . f1.txt is opened in the read text rt mode and is referenced to fin . f2.txt is opened in the write text wt mode and is referenced to fout . Вони для промені є iterated, і для кожного випадку string gode in the file, it gets replaced by the word God . Both the files are then closed after the necessary operations with help of the close() function.
Use the replace() Function When Only One File Is Used for Input and Output
У цьому методі, той самий файл використовується як both input and output.
We use the with statement here along with the replace() функція. The with context manager has a fundamental function: making the program shorter and much more readable.
When we use the with statement with File handling, file that we opened in the Python code doesn’t need to be manually closed; it автоматично closes after the with block terminates.
Натиснувши на code, ви використовуєте replace() функцію, щоб відредагувати string в Python, коли ввести і запустити файл is the same.
with
open("file1.txt", "rt") as file:
x = file.read()
with
open("file1.txt", "wt") as file:
x = x.replace("gode", "God")
fin.write(x)
Наступні коди файлів1 є як вхідний файл, так і вихідний файл. Перш за все, файл є відкритим у тексті read mode, і вмісту файлу є read and stored in a variable. Там, файл є closed і оголошений, але в повідомленні тексту mode wt this time. string is replaced, and the data is written in this mode, and then the file is closed.
Vaibhhav є IT професіонал, який має сильний список в Python програмування і різних проектів під його статтю. Він мав високу оцінку нових думок і є quick learner.
Related Article - Python File
Related Article - Python String
Copyright © 2024. All right reserved
Python 3. Пошук та заміна рядків у файлах
Ця стаття буде корисна для людей, які тільки починають працювати з Python і зовсім не уявляють як працювати з файлами. Я хочу з вами поділитися своїм досвідом роботи з Python, а саме розповім як шукати та замінювати рядки у .txt файли.
У своїх прикладах я використовуватиму Python версії 3.8.3 (остання версія на момент написання статті). Ви можете використовувати будь-яку версію вище 3, оскільки глобальні відмінності в синтаксисі були лише між мажорними версіями 2 і 3.
Для початку давайте сформуємо наші вимоги і вже під них писатимемо код. Давайте уявимо, що у нас є якийсь файл, де нам потрібно знайти і замінити (модифікувати) рядки за певними параметрами.
Наприклад:
У нас є файл з текстом - якийсь Patch в базу даних у вигляді .txt. Хтось може запитати себе, а що це за Patch такий, в .txt форматі?А відповідь буде такою - patch створений за допомогою Protocol Bufers або в народі-protobuf. Але зараз не про них. Файл містить у собі різні дані та Timestamps - дата коли дані повинні застосовуватися. І наше завдання знайти все Timestamps у файлі і додати до них коментар у людиночитаному вигляді, щоб потім було простіше розуміти який час там позначено. Навіщо нам коментар у патчі до бази, який нікуди не запишатися запитаєте ви? Просто для зручності, щоб під час перевірки цього патчу на code review було відомо яка дата використовується.
Маємо файл із таким змістом:
Зверніть уваги на відступи у секції time. Це зроблено спеціально, далі побачите, навіщо я це зробив. А поки що можете думати що у нас незграбний код :)
Для роботи з файлами я використовуватиму модуль fileinput, хоча можна працювати і просто методом open. Але якщо ми хочемо обробляти відразу багато файлів, то fileinput - те, що нам треба.До речі, я всім, хто вчитися чи знайомитися з новими бібілотеками чи мовами, рекомендую спочатку дивитися офіційну документацію, бо тільки в офіційній документації можна дізнатися все в подробицях та з нюансами, а потім уже шукати на stackoverflow або десь ще.
Якщо забігти наперед, але наш код може виглядати так:
А результат роботи з файлом так:
Але давайте розберемо докладніше, що тут відбувається для більшої наочності.
Спочатку давайте подивимося на ці дві функції, вони досить прості.
тут ми форматуємо timestamp в UTC рядок.
# передавши 1589500800000 отримаємо рядок - 2020-05-15 00:00:00+00:00def FormatMillisToUtc(millis, tz=pytz.UTC):
seconds = millis/1000.0
return FormatDateTime(
datetime.datetime.fromtimestamp(seconds, tz=tz))
# тут ми форматуємо отриманий рядок у рядок, який хочемо відобразити
# В результаті у нас буде рядок - Fri 2020-05-15 00:00:00def FormatDateTime(dt):
return dt.strftime('%a %Y-%m-%d %H:%M:%S')
Так, форматувати millis у UTC рядки ми навчилися, давайте тепер навчимося шукати ці millis у нашому файлі. Для цього я написав просто RegExp який шукає будь-який рядок який закінчується на _millis: і за якою йде від 0 до безлічі відступів (прогалин) і за відступом відразу йде будь-яке число. Звичайно можна було б обмежити кількість чисел, що йде після відступів, наприклад довгою в , і бути впевненим що ми працюємо з timestamp починаючи з 2001 по ~2200 роки, але навіщо обмежувати себе, краще напишемо перевірку на випадок, коли введуть більше або менше 13 цифр в timestamp.
# наш RegExp
reg_exp_to_match_millis_string = re.compile(r'(\w*_millis:\s*\d+)')# і далі в коді ми шукатимемо збіги у рядку з нашим RegExp
reg_exp_to_match_millis_string.search(line):
Я обернув код у try/expect для випадку, коли ми не можемо прочитати файл, наприклад шлях до файлу неправильний. В цьому випадку наш скрипт в консоль напише warning і продовжить роботу без падіння.
except FileNotFoundError:
warnings.warn(UserWarning('File can not be read. Please check file - '))
Використовуючи слово with, ми можемо не закривати файл “ручками”, за нас це зробити Python і в разі помилки, нам не доведеться руками писати обробку по закриття файлу. millis які хочемо змінити.
with fileinput.input(path_to_file, inplace=True) as file:
for line in file:
if reg_exp_to_match_millis_string.search(line):
.
else:
print(line, end='')
Коли ми знаходимо рядок, ми його перетворимо на масив для зручності роботи з нею. До речі, про погане форматування нашого файлика file.txtпам'ятайте відступи зліва в наших об'єктах і відсупи між *_millis: і timestamp? Так ось що б не порушувати форматування яке було у файлі спочатку, ми просто обрізаємо - line.rstrip() рядок по правому краю, а лівий не чіпаємо. Таким чином зберігаємо відсупи зліва.
time_list = line.rstrip().split(':')
millis = int(time_list[1])
Далі ми обертаємо наш код у try/expect та якщо з timestamp все добре, ми його парсимо та перетворюємо на наш формат що ми обговорили раніше.
try:
utc_time = FormatMillisToUtc(millis)
print(':'.join(time_list) + f' # UTC time: ')
Якщо ми не можемо перетворити timestamp в рядок і щоб наш код не впав, ми обробимо цю помилку і запишемо її користувачеві в файл, щоб він міг зрозуміти що в нього щось не так з timestamp і зробити відповідні зміни. timestamp ми отримали 15 або більше і бібліотека Python не змогла перетворити це на дату.
except ValueError as e:
print(f'#Error: Could not parse timestamp - .' ,e)
print(line, end='')
Як бачите, нічого складного в роботі з файлами в Python немає, особливо коли сформулювання завдання і ти можеш розбити його на дрібні етапи або блоки. Як і все в програмуванні або в будь-якій іншій справі - складається з маленьких блоків або етапів, з'єднуючи їх докупи, отримуємо хороший кінцевий результат.
P.S. якщо вам стаття сподобається і ви захочете дізнатися, як подібний код потрібно покривати тестами, дайте мені знати і я напишу ще одну статтю з тестів.
🔧 Як замінити текст у файлі Python: простий посібник з прикладами та порадами
Викличте функцію replace_text_in_file з аргументами: шлях до файлу, текст, який потрібно замінити, та новий текст, який потрібно замінити. Наприклад:
replace_text_in_file('file.txt', 'старий текст', 'новий текст')
Цей код відкриє файл із ім'ям 'file.txt', замінить усі входження 'старий текст' на 'новий текст' і перезапише файл із оновленим вмістом. Переконайтеся, що ви маєте право на запис у файл, який ви намагаєтеся змінити. Також зверніть увагу, що цей код замінить усі входження вказаного тексту. Якщо вам потрібно замінити лише перше входження, вам може знадобитися змінити код.
Детальна відповідь
Як замінити текст у файлі за допомогою Python
Python пропонує різні способи заміни тексту у файлі. У цій статті розглянемо кілька з них, щоб ви могли вибрати відповідний для вашого завдання.
1. Заміна тексту у файлі з використанням методу `replace()`
Метод `replace()` - це простий спосіб замінити всі входження певного рядка на інший рядок. Ось як це робиться:
def replace_text(file_path, old_text, new_text): з Open(file_path, 'r') як файл: file_data = file.read() file_data = file_data.replace(old_text, new_text) with open(file_path, 'w') as file : file.write(file_data)
У цьому прикладі відкриваємо файл за допомогою оператора `with` для автоматичного закриття файлу після використання. Потім ми зчитуємо весь текст файлу змінну `file_data` за допомогою методу `read()`.Замінюємо всі входження `old_text` на `new_text` за допомогою методу `replace()`, а потім записуємо змінені дані назад у файл методом `write()`.
2. Заміна тексту у файлі з використанням бібліотеки `fileinput`
Бібліотека `fileinput` надає зручний спосіб заміни тексту у файлі, зберігаючи оригінальну структуру файлу. Ось приклад використання бібліотеки `fileinput`:
import fileinput def replace_text(file_path, old_text, new_text): з fileinput. ='')
У цьому прикладі ми відкриваємо файл за допомогою fileinput.FileInput() і вказуємо 'inplace=True', щоб зміни вносилися безпосередньо до файлу. Оригінальний файл буде збережено з розширенням `.bak` у разі потреби відновлення. Потім ми проходимо по кожному рядку файлу і замінюємо `old_text` на `new_text`, виводячи змінений рядок за допомогою функції `print()`.
3. Заміна тексту у файлі з використанням регулярних виразів
Якщо вам потрібний більш гнучкий підхід до заміни тексту у файлі, ви можете використовувати регулярні вирази за допомогою модуля `re`. Ось приклад:
import re def replace_text_regex(file_path, old_text, new_text): з Open(file_path, 'r') як файл: file_data = file.read() file_data = re.sub(old_text, new_text, file_data) with open(file_path, ' ') як файл: file.write(file_data)
У цьому прикладі ми використовуємо метод `re.sub()` для заміни `old_text` на `new_text` у змінній `file_data`. Потім ми записуємо змінені дані у файл методом `write()`.
4. Обробка великих файлів
Якщо ви працюєте з дуже великими файлами, можливо, вам потрібно буде використовувати більш ефективну стратегію. Розглянемо приклад з використанням методу читання та запису файлів за шматочками:
def replace_text_chunks(file_path, old_text, new_text, chunk_size=4096): з Open(file_path, 'r') як файл: з Open(file_path + '.tmp', 'w') як temp_file: while True: chunk = file. read(chunk_size) if не chunk: break temp_file.write(chunk.replace(old_text, new_text)) # Перейменовуємо тимчасовий файл os.rename(file_path + '.tmp', file_path)
У цьому прикладі ми читаємо та записуємо файл по шматочках з використанням буфера розміром `chunk_size`. Ми застосовуємо заміну тексту до кожного шматочка і записуємо зміни до тимчасового файлу. Після завершення обробки всього файлу ми перейменовуємо тимчасовий файл, замінюючи оригінальний файл. Тепер у вас є кілька способів замінити текст у файлі за допомогою Python. Розгляньте свої потреби та виберіть найбільш підходящий для вашого завдання метод. Успіхів у програмуванні з Python!