1. Code
  2. Python

Как Внести Изменения в Несколько Файлов с Помощью Python

Давайте предположим, что некто, хорошо знакомый с Британскими правилами правописания, решил завершить свое обучение в США. Его попросили написать работу о Python. Он хорошо разбирается в Python, и написать работу не сложно. Он рассказывает об изображениях в какой-то части своей работы и много раз использовал слово grey (Британское правописание) вместо gray (Американское правописание), а так же neighbourhood (Британское правописание) вместо neighborhood (Американское правописание). Но он теперь в США и следовательно теперь нужно пройтись по все словам, в которых используется Британские правила правописания и заменить их словами на Американский манер.
Scroll to top

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.