Как Внести Изменения в Несколько Файлов с Помощью Python
Russian (Pусский) translation by Andrey Rybin (you can also view the original English article)
Давайте предположим, что некто, хорошо знакомый с Британскими правилами правописания, решил завершить свое обучение в США. Его попросили написать работу о Python. Он хорошо разбирается в Python, и написать работу не сложно. Он рассказывает об изображениях в какой-то части своей работы и много раз использовал слово grey (Британское правописание) вместо gray (Американское правописание), а так же neighbourhood (Британское правописание) вместо neighborhood (Американское правописание). Но он теперь в США и следовательно теперь нужно пройтись по все словам, в которых используется Британские правила правописания и заменить их словами на Американский манер.
Это один из возможных сценариев, когда необходимо изменить что-то в правописании или исправить ошибку в нескольких местах.
В этом коротком уроке, я покажу вам пример, когда у нас есть пять текстовых файлов, в которых мое имя написано с ошибкой. То есть вместо Abder, написано Adber. В примере будет показано, как использовать Python, что бы исправить ошибку в моем имени во всех текстовых файлах, лежащих в одной директории.
Начнем!
Подготовка Данных
Прежде чем мы начнем заниматься нашей задачей, давайте подготовим данные (текстовые файлы) с которыми мы будем работать. Возьмите и скачайте папку с этими файлами. Распакуйте архив, и, теперь, все готово к работе.
Как вы можете видеть, у нас есть папка с именем Abder, в которой находится пять файлов с именами 1, 2, 3, 4, и 5.
Реализация
Перейдем к самой интересной части. Первое что мы должны сделать, это прочитать содержимое директории Abder. Для этого мы можем использовать функцию listdir(), следующим образом:
1 |
import os |
2 |
directory = os.listdir('/Users/DrAbder/Desktop/Abder') |
Если мы хотим увидеть, что находится внутри директории, мы можем написать следующую команду:
1 |
print directory |
В этом случае мы получим:
1 |
['.DS_Store', '1.rtf', '2.rtf', '3.rtf', '4.rtf', '5.rtf'] |
Что говорит нам о том, что у нас есть пять rtf файлов внутри директории.
Что бы быть уверенными, что мы работаем с текущей директорией (той которая нам нужна), мы можем использовать функцию chdir следующим образом:
1 |
os.chdir('/Users/DrAbder/Desktop/Abder') |
Следующее, что нам нужно сделать, это цикл по всем файлам в директории Abder. Мы можем использовать цикл for-loop следующим образом:
1 |
for file in directory: |
Так как мы хотим просмотреть каждый из пяти файлов в директории и найти Adber, правильным на данном этапе, будет отрыть и считать содержимое каждого файла:
1 |
open_file = open(file,'r') |
2 |
read_file = open_file.read() |
Теперь мы подходим к очень важному шагу, особенно когда речь идет о поиске соответствия шаблону, в нашем случае, поиске Adber. Это использование regular expressin (регулярных выражений). В Python, для того чтобы использовать регулярные выражения, мы будем применять re модуль.
Мы будем использовать две основные функции из этого модуля. Первая - это compile():
Компилирует шаблон регулярного выражения в объект , который может использоваться для сопоставления с использованием функцийmatch()иsearch().
И вторая - это sub(), для замены слов с ошибочным правописанием на правильные. Таким образом, мы делаем следующее:
1 |
regex = re.compile('Adber') |
2 |
read_file = regex.sub('Abder', read_file) |
В конце, мы запишем новый текст в файл, после того как была сделана подстановка:
1 |
write_file = open(file,'w') |
2 |
write_file.write(read_file) |
Собираем Все Вместе
В этой части давайте посмотрим, как будет выглядеть весь Python скрипт, который будет искать Adber в каждом файле и заменять на Abder:
1 |
import os, re |
2 |
|
3 |
directory = os.listdir('/Users/DrAbder/Desktop/Abder') |
4 |
os.chdir('/Users/DrAbder/Desktop/Abder') |
5 |
|
6 |
for file in directory: |
7 |
open_file = open(file,'r') |
8 |
read_file = open_file.read() |
9 |
regex = re.compile('Adber') |
10 |
read_file = regex.sub('Abder', read_file) |
11 |
write_file = open(file,'w') |
12 |
write_file.write(read_file) |
Как мы видим, Python позволяет очень легко произвести изменения в нескольких файлах, используя цикл for-loop. Другой важный момент, который следует извлечь из этого урока это использование регулярных выражений для поиска совпадений.
Если вы хотите знать больше о циклах в Python, посмотрите урок A Smooth Refresher on Python's Loop. И для того, что бы больше узнать о регулярных выражениях, посмотрите Regular Expressions in Python.



