Учим python на примерах. Пример 1

Давайте учить python на реальных задачах

Задача

Написать консольную утилиту, передав которому путь к какой то папке, она выводит список файлов и папок, которые есть в этой папке

Решение

Скажем интерпретатору, что кодировка нашего файла utf-8. Не забудьте выставить именно эту кодировку в вашем редакторе

# coding: utf-8

Далее мы импортируем необходимые нам [модули][modules]

[os][os], [sys][sys] - системные модули

import os
import sys

Получим путь

Модуль [sys][sys] имеет атрибут [argv][sys.argv], который является [списком][list] [строк][str], первый элемент этого этого списка, 0 позиция, это всегда название или путь нашего скрипта, а уже следующие элементы, это ещё какие то данные, переданные нашему скрипту.

Поэтому путь к папке мы будем брать оттуда

Например, если запустить наш скрипт так

python script.py

то [sys.argv][sys.argv] будет содержать следующий список

['/home/ilnurgi/script.py']

Например, если запустить наш скрипт так

python script.py /home/ilnurgi/

то [sys.argv][sys.argv] будет содержать следующий список

['/home/ilnurgi/script.py', '/home/ilnurgi/']

Также мы обернем получение пути из списка в конструкцию [try/except][try/except], т.к. путь может быть и не указан.

Соответственно если путь не задан, то и в списке [sys.argv][sys.argv] его не будет и python возбудит ошибку [IndexError][IndexError], при обращении к несуществующему элементу списка.

В этом случае мы перехватим ошибку, напечатаем какой-то текст и выйдем из выполняемого скрипта

try:
    dir_path = sys.argv[1]
except IndexError:
    print u'Отсутсвует путь к папке'
    exit()

Строку в юникод

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

Для этого, вызовем у полученного объекта метод, [decode][str.decode], который вернет нам юникодную строку, необходимо также передать кодировку

dir_path = dir_path.decode('utf-8')

Существует ли путь в системе

Проверим, существует ли вообще указанный путь dir_path, если нет, то сообщим об этом пользователю.

Для проверки мы используем метод [exists][os.path.exists], модуля [path][os.path], который в свою очередь находится в модуле [os][os]

Данный метод вернет нам [булево][bool] True или False, соответственно существует или нет путь в системе

path_exists = os.path.exists(dir_path)
if path_exists is not True:
    # выведем сначала полученный путь папки, а потом уже наше сообщение
    print dir_path, u'такого пути не существует в системе'
    exit()

Путь это папка?

Проверим, является ли полученная строка dir_path, папкой. Если нет, то сообщим об этом пользователю.

Для проверки мы используем метод [isdir][os.path.isdir], модуля [path][os.path], который в свою очередь находится в модуле [os][os]

Метод вернет нам булево True или False, соответственно является путь папкой или нет

is_path = os.path.isdir(dir_path)
if is_path is not True:
    # выведем сначала полученный путь папки, а потом уже наше сообщение
    print dir_path, u'не является папкой'
    exit()

Список файлов и папок

Получим список файлов и папок из указанной директории.

Используем метод [listdir][os.listdir], модуля [os][os], который получает путь к папке и возвращает список строк, файлы и папки в указанной директории

files = os.listdir(dir_path)

Выведем все элементы списка построчно в консоль, для этого напишем [цикл][for]

for i in files:
    print i

Готово

# coding: utf-8

import os
import sys

try:
    dir_path = sys.argv[1]
except IndexError:
    print u'Отсутсвует путь к папке'
    exit()

dir_path = dir_path.decode('utf-8')

path_exists = os.path.exists(dir_path)
if path_exists is not True:
    print dir_path, u'такого пути не существует в системе'
    exit()

is_path = os.path.isdir(dir_path)
if is_path is not True:
    # выведем сначала полученный путь папки, а потом уже наше сообщение
    print dir_path, u'не является папкой'
    exit()

files = os.listdir(dir_path)

for i in files:
    print i