Опубликован: 14.06.2015 | Доступ: свободный | Студентов: 4652 / 500 | Длительность: 21:48:00
Авторские права: Creative Commons Attribution 3.0
Лекция 15:

Автоматизация типичных задач на вашем компьютере

28.4. Программные каналы (pipes)

Большинство операционных систем предоставляет интерфейс командной строки, известный под названием оболочка (shell). Оболочка обычно предоставляет команды для перемещения по файловой системе и запуска приложений. Например, в Unix'е можно перемещаться по директориям с помощью команды "cd", просматривать содержимое директории с помощью "ls" и запускать веб-браузер, например, с помощью команды "firefox".

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

Программный канал (pipe) – это объект, представляющий работающий процесс.

Например, команда Unix'а1При использовании каналов для вызова команд операционной системы, таких, как "ls", важно знать, какую именно операционную систему вы используете, и вызывать только команды, поддерживаемые операционной системой. "ls -l" показывает содержимое текущего каталога (в подробном формате). Можно запустить эту команду, используя метод os.popen:

>>> cmd = 'ls -l'
>>> fp = os.popen(cmd)
  

Аргументом является строка, содержащую команду оболочки. Возвращаемое значение является указателем на файл, который можно использовать точно так же, как и при открытии обычного файла с помощью функции open. Можно читать вывод процесса "ls" последовательно по одной строке с помощью метода readline или получить сразу весь вывод с помощью метода read:

>>> res = fp.read()

По окончании работы следует закрыть канал так же, как и файл:

>>> stat = fp.close()
>>> print stat
None
  

Возвращаемое методом close значение содержит статус завершения процесса ls; "None" означает нормальное завершение (т.е. отсутствие ошибок).

28.5. Глоссарий

Абсолютный путь (absolute path): строка, описывающая, где хранится файл или каталог (директория), начинающаяся с корня дерева каталогов. Абсолютный путь можно использовать для доступа к файлу или каталогу независимо от текущего каталога.

Контрольная сумма (checksum): см. также "хеширование". Термин "контрольная сумма" был порожден необходимостью проверки данных, посланных по сети или записанных на внешний носитель и затем прочитанных обратно. Когда данные записываются или пересылаются, передающая система вычисляет контрольную сумму и пересылает ее вместе с данными. Когда данные считываются или принимаются по сети, принимающая система перевычисляет контрольную сумму полученных данных и сравнивает ее с принятой контрольной суммой. Если контрольные суммы не совпадают, то это означает, что данные были искажены при передаче.

Аргументы командной строки (command line arguments): параметры, указанные в командной строке Питона после имени файла с программой.

Текущий каталог/директория (current working directory): текущий каталог, в котором "вы находитесь". Можно изменить текущий каталог, используя команду "cd", которая есть в большинстве операционных систем в командном интерфейсе. Когда вы открываете файл в Питоне, используя только его имя и не указывая путь, файл должен быть в текущем каталоге, в котором вы запускаете программу.

Хеширование (hashing): чтение потенциально очень большого объема данных и вычисление контрольной суммы для этих данных — так называемой хеш-функции. Лучшие хеш-функции создают минимальное число "коллизий", когда два различных потока данных дают при вычислении хеш-функции один и тот же результат. MD5, SHA1 и SHA256 являются названиями наиболее распространенных хеш-функций.

Программный канал (pipe): устанавливает связь между работающими программами. Используя канал, можно написать программу, которая посылает данные другой программе или принимает данные от нее. Программный канал аналогичен сокету, за исключением того, что каналы могут использоваться лишь для связи между программами, работающими на одном и том же компьютере (не через сеть).

Относительный путь (relative path): строка, описывающая, где хранится файл или каталог (директория) относительно текущего каталога.

Командная оболочка (shell): интерфейс командной строки к операционной системе, называемый также "терминалом" в некоторых системах. В нем пользователь вводит команду и ее параметры и затем нажимает клавишу "Enter" для выполнения команды.

Обход (walk): термин, используемый для описания процесса посещений узлов дерева каталогов, подкаталогов, под-подкаталогов, пока мы не посетим все каталоги. Мы называем этот процесс "обходом дерева каталогов/директорий".

28.6. Упражнения

Упражнение 28.1.

В большом собрании MP3-файлов могут быть копии одних и тех же песен, сохраненные в разных директориях или в файлах с разными именами. Цель этого упражнения – найти все повторяющиеся файлы.

  1. Напишите программу, которая обходит все каталоги и подкаталоги, находит все файлы с указанным суффиксом (например, .mp3) и перечисляет пары файлов с одинаковым размером. Совет: используйте словарь, в котором ключом является размер файла, полученный с помощью метода os.path.getsize, а значением является путь к файлу (включая его имя). При получении очередного файла проверяйте, имеется ли уже в словаре файл с таким же размером. Если да, то надо напечатать размер файла и названия обоих файлов (один из словаря, второй — текущий просматриваемый файл).
  2. Измените предыдущую программу так, чтобы она сравнивала не только размеры, но и содержимое файлов, используя алгоритм вычисления контрольной суммы или хеш-функции. Например, алгоритм MD5 (Message-Digest algorithm 5) читает "сообщение" произвольной длины и вычисляет 128-битовую "контрольную сумму". Вероятность того, что у двух разных файлов будет одинаковая контрольная сумма, ничтожно мала. Описание MD5 можно прочитать по адресу wikipedia.org/wiki/Md5. Следующий фрагмент кода открывает файл, читает его содержимое и вычисляет контрольную сумму.
    import hashlib
    ...
    fhand = open(thefile,'r')
    data = fhand.read()
    fhand.close()
    checksum = hashlib.md5(data.encode()).hexdigest()
        

    Вы должны создать словарь, в котором контрольная сумма используется как ключ, а имя файла — как значение ключа. Если вычисленная контрольная сумма файла уже содержится в словаре в виде ключа, значит, найдены два файла с одинаковым содержимым; поэтому мы печатаем путь к файлу из словаря и к текущему рассматриваемому файлу. Вот что выдает программа, запущенная для каталога с файлами изображений:

    ./2004/11/15-11-04_0923001.jpg ./2004/11/15-11-04_1016001.jpg
    ./2005/06/28-06-05_1500001.jpg ./2005/06/28-06-05_1502001.jpg
    ./2006/08/11-08-06_205948_01.jpg ./2006/08/12-08-06_155318_02.jpg
    ./2006/09/28-09-06_225657_01.jpg ./2006/09-50-years/28-09-06_225657_01.jpg
    ./2006/09/29-09-06_002312_01.jpg ./2006/09-50-years/29-09-06_002312_01.jpg
        

    Очевидно, я иногда отправляю одни и те же фотографии более одного раза или копирую фотографии без удаления файла-оригинала.

Ксения Шошина
Ксения Шошина

курс Программирование на Python

Илья Кизилов
Илья Кизилов

В лекции приводится программа для сортировки слов по их длинне. В коде ошибка. Я исправил так:

def sort_by_length(words):

words = words.split()

t = []

for word in words:

t.append((len(word), word))

t.sort(reverse=True)

res = []

for length, word in t:

res.append(word)

return res

print(sort_by_length(words))

 

Кто ещё как сделал?