Доброго времени суток, читатели, зрители моего канала programmer's notes.
Ещё одно приложение к видео
Некоторые приёмы работы с текстовыми файлами и функции высшего порядка
Ломал голову, нужно здесь делать видео или достаточно текста. Пришёл к выводу, что текста достаточно. Тут я ещё одну мысль вынашиваю, чтобы вспомнить функции высшего порядка, о которых можно узнать здесь и здесь. Очень удобная вещь, если вы работает со списками строк, которые как раз и получаются из текстовых файлов в результате чтения.
Текстовый файл, это в сущности поток строк. Мы последовательно читаем одну строку за другой. Если нам что-то нужно изменить в файле, то следует его перезаписать. Здесь есть два подхода:
- Считываем все строки в список, редактируем список и перезаписываем файл.
- Читая последовательно строки, при необходимости редактируем их и записываем в другой файл. Потом вторым файлом замещаем первый файл.
Второй способ будет разобран нами несколько позднее, когда будем заниматься библиотекой os, а о первом способе поговорим в данной статье.
В сущности речь по пойдёт о, наверно, забытых уже вами функциях высшего порядка. А они чертовски удобны, хотя конечно, без них можно спокойно обойтись. Но здесь я без них обходиться не буду.
И так первая задача. Дан текстовый файл, нужно удалить некоторые строки в этом файле. Критерием удаления может любое свойства, например, наличие а них определённой подстроки.
Нет лучше способа удаления строк из списка, как функция filter().
#!/usr/bin/python3
f1 = open('tmp', 'r')
ls = f1.readlines()
f1.close()
ls1 = list(filter(lambda x:'qwerty' not in x, ls))
f1 = open('tmp', 'w')
f1.writelines(ls1)
f1.close()
Однако можно всё сделать ещё проще: отобрать нужные строки при чтении из файла.
#!/usr/bin/python3
f1 = open('tmp', 'r')
ls = [t for t in f1 if 'qwerty' not in t]
f1.close()
f1 = open('tmp', 'w')
f1.writelines(ls)
f1.close()
Следующая задача. Нужно изменить некоторые строки в файле.
#!/usr/bin/python3
f1 = open('tmp', 'r')
ls = f1.readlines()
f1.close()
ls = list(map(lambda x: x if 'qwerty' not in x else 'zxcv\n', ls))
f1 = open('tmp', 'w')
f1.writelines(ls)
f1.close()
Здесь нам помогла моя любимая функция map(). Если, например, нам необходимо заменить некоторые подстроки в строках файла, то можно использовать следующую строку с map().
ls = list(map(lambda x: x.replace('qwerty', '123456'), ls))
А если, к примеру, вы хотите пронумеровать строки в файле. Да легко. Функция enumerate() вам в помощь.
#!/usr/bin/python3
f1 = open('tmp', 'r')
ls = [str(i) + ' ' + t for i, t in enumerate(f1, start=1)]
f1.close()
f1 = open('tmp', 'w')
f1.writelines(ls)
f1.close()
Ну и, наконец, еще одна возможная задача, связанная с текстовыми файлами. Вставка дополнительной строки (или строк).
Вставка элемента в список лучше всего производить с помощью срезов.
ls[i:i] = [el]
Элемент el вставляется перед элементом, со значением индекса i. Кстати добавить элемент в конец можно по той же схеме
ls[len(ls):len(ls)] = [el]
Вставив же нужные строки, мы опять по той же схеме переписываем текстовый файл (см. выше).
Всего наилучшего. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.