Найти тему
programmer's notes (python and more)

Стандартные библиотеки в Python. Ещё не много о текстовых файлах. Приложение 3 к видео 3

Доброго времени суток, читатели, зрители моего канала programmer's notes.

Стандартные библиотеки Python | programmer's notes | Дзен
programmer's notes

Ещё одно приложение к видео

Некоторые приёмы работы с текстовыми файлами и функции высшего порядка

Ломал голову, нужно здесь делать видео или достаточно текста. Пришёл к выводу, что текста достаточно. Тут я ещё одну мысль вынашиваю, чтобы вспомнить функции высшего порядка, о которых можно узнать здесь и здесь. Очень удобная вещь, если вы работает со списками строк, которые как раз и получаются из текстовых файлов в результате чтения.

Текстовый файл, это в сущности поток строк. Мы последовательно читаем одну строку за другой. Если нам что-то нужно изменить в файле, то следует его перезаписать. Здесь есть два подхода:

  1. Считываем все строки в список, редактируем список и перезаписываем файл.
  2. Читая последовательно строки, при необходимости редактируем их и записываем в другой файл. Потом вторым файлом замещаем первый файл.

Второй способ будет разобран нами несколько позднее, когда будем заниматься библиотекой 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.

Послушайте старого программиста, который ещё при Ленине кодил
Послушайте старого программиста, который ещё при Ленине кодил