Сразу прошу прощение за форматирования кода... 
@TODO : прикрутить модуль !
Допустим у нас на сервере есть каталог с файлами:
/var/www/mysite/files
    photoes.zip
    1.jpg
    2.jpg
    3.jpg
    im.gif
    document.pdf
Чтобы получить содержимое этого каталога в виде списка, можно воспользоваться встроенным модулем os: 
#Подключаем модуль
import os
#Каталог из которого будем брать файлы
directory = '/var/www/mysite/files'
#Получаем список файлов в переменную files
files = os.listdir(directory)
В результате files будет равна: 
['photoes.zip', '1.jpg', '2.jpg', '3.jpg', 'im.gif', 'document.pdf']
Если нужно получить файлы только определенного типа, их можно отфильтровать по расширению: 
#Подключаем модуль
import os
#Каталог из которого будем брать изображения
directory = '/var/www/mysite/files'
#Получаем список файлов в переменную files
files = os.listdir(directory)
#Фильтруем список
images = filter(lambda x: x.endswith('.jpg'), files)
Теперь в переменной images такой список: 
['1.jpg', '2.jpg', '3.jpg']
решение взято с сайта: http://tutorialbox.freelancing.lv/tutorials/6
Получить список файлов в каталоге v2
Немного магии от модуля os
os.walk() - возвращает объект-генератор. Из полученного объекта можно получить кортежи 
для каждого каталога в переданной walk файловой иерархии. Каждый кортеж состоит из трех 
элементов: 
1. Абсолютный адрес очередного каталога (строка).
2. Имена (без адреса) подкаталогов первого уровня для текущего каталога (список).
3. Имена (без адреса) файлов данного каталога.
Посмотрим, как это работает. Допустим, у нас есть такое дерево каталогов:
tree = os.walk('/home/pl/mydir') 
На что же ссылается tree? Попробуем просто получить данные, связанные с данной переменной.
print(tree)
В результате видим
 < generator object walk at 0x00A8B620 >
Итак, есть объект-генератор. Поскольку полученный объект генерирует кортежи, количество 
которых равно количеству каталогов в дереве, то можно их получить с помощью цикла for и, 
например, вывести на экран
for d in tree:
 print (d)
В соответствии с вышеуказанным деревом каталогов получится следующее:
('/home/pl/mydir', ['dir2a', 'dir2b'], ['mash187.pas', 'mash189.pas', 'menu_.php', 'xorg.conf', 'клав_тренажер.odt', 'Расписание 2004.xls'])
('/home/pl/mydir\\dir2a', ['dir3'], ['less1.doc', 'Patro_Nia.ogg', 'Расписание 2004.doc'])
('/home/pl/mydir\\dir2a\\dir3', [], ['bottom_.php', 'equador.mid', 'less1.html', 'net_Alt.txt', 'poly995.mid', 'top_.php'])
('/home/pl/mydir\\dir2b', [], ['clear.gif', 'fon1.jpg', 'logo4.png', 'okulov245.pas', 'okulov273.pas', 'plan1.jpg', 'plan2.jpg'])
Итак, налицо четыре кортежа (у нас четыре каталога – см. схему выше). Каждый кортеж 
включает три элемента. Первый – это адрес каталога, второй – список поддиректорий не глубже 
первого уровня, третий – список имен файлов. Если вложенных каталогов или файлов нет, то 
соответствующий им список будет пуст.
Если мы еще раз запустим цикл с переменной tree, то уже ничего не получим. Дело в том, 
что объект-генератор, с которым переменная была связана, уже был использован, он выдал 
свое содержимое и больше его не содержит. Поэтому, если требуется сохранить кортежи для 
последующий обработки, то лучше сохранить их, например, в списке:
 >>> import os
 >>> pdir = 'G:/projects/pythoner.info/pypath/mydir'
 >>> contdir = []
 >>> for i in os.walk(pdir):
   contdir.append(i)
 
 >>> for i in contdir:
   print (i)
 
('G:/projects/pythoner.info/pypath/mydir', ['dir2a', 'dir2b'], ['mash187.pas', 'mash189.pas', 'menu_.php', 'sg30.thm', 'xorg.conf', 'клав_тренажер.odt', 'Расписание 2004.xls'])
('G:/projects/pythoner.info/pypath/mydir\\dir2a', ['dir3'], ['less1.doc', 'Patro_Nia.ogg', 'Thumbs.db', 'Расписание 2004.doc'])
('G:/projects/pythoner.info/pypath/mydir\\dir2a\\dir3', [], ['equador.mid', 'fon1.jpg', 'logo4.png', 'logos.bmp', 'net_Alt.txt', 'plan1.jpg', 'poly995.mid', 'Thumbs.db', 'top_.php'])
('G:/projects/pythoner.info/pypath/mydir\\dir2b', [], ['bottom_.php', 'clear.gif', 'less1.html', 'okulov245.pas', 'okulov273.pas', 'plan2.jpg', 'sg30.sdv'])
С помощью функции walk() можно получить имена файлов с тем, чтобы в дальнейшем с ними 
что-нибудь делать с помощью других методов Python и его модулей. Получить их можно, 
извлекая из третьего элемента каждого кортежа. Сделать это можно так, как показано ниже:
for d, dirs, files in os.walk('c:/mydir'):
 for f in files:
  print (f)
Переменная d в каждой итерации связывается с первым элементом каждого кортежа (строкой, 
содержащей адрес каталога), dirs – со вторым элементом (списком подкаталогов), а files - 
со списками файлов очередного каталога. Чтобы извлечь списки файлов целиком, а не 
выделять каждый файл по отдельности, можно сделать так:
for d, dirs, files in os.walk('c:/mydir'):
 print (files)
И получить:
['mash187.pas', 'mash189.pas', 'menu_.php', 'xorg.conf', 'клав_тренажер.odt', 'Расписание 2004.xls']
['less1.doc', 'Patro_Nia.ogg', 'Расписание 2004.doc']
['bottom_.php', 'equador.mid', 'less1.html', 'net_Alt.txt', 'poly995.mid', 'top_.php']
['clear.gif', 'fon1.jpg', 'logo4.png', 'okulov245.pas', 'okulov273.pas', 'plan1.jpg', 'plan2.jpg']
Имена файлов не полные. Они не содержат адреса, следовательно, для операций с файлами 
таких списков не достаточно. Для получения полных адресов подойдет функция 
os.path.join(). С ее помощью можно объединить первый элемент кортежа, содержащий полный 
путь, с именем каждого файла:
 >>> path_f = []
 >>> for d, dirs, files in os.walk('c:/mydir'):
 for f in files:
  path = os.path.join(d,f) # формирование адреса
  path_f.append(path) # добавление адреса в список
 
 >>> path_f
['c:/mydir\\mash187.pas', 'c:/mydir\\mash189.pas', 'c:/mydir\\menu_.php', 'c:/mydir\\xorg.conf', 'c:/mydir\\клав_тренажер.odt', 'c:/mydir\\Расписание 2004.xls', 'c:/mydir\\dir2a\\less1.doc', 'c:/mydir\\dir2a\\Patro_Nia.ogg', 'c:/mydir\\dir2a\\Расписание 2004.doc', 'c:/mydir\\dir2a\\dir3\\bottom_.php', 'c:/mydir\\dir2a\\dir3\\equador.mid', 'c:/mydir\\dir2a\\dir3\\less1.html', 'c:/mydir\\dir2a\\dir3\\net_Alt.txt', 'c:/mydir\\dir2a\\dir3\\poly995.mid', 'c:/mydir\\dir2a\\dir3\\top_.php', 'c:/mydir\\dir2b\\clear.gif', 'c:/mydir\\dir2b\\fon1.jpg', 'c:/mydir\\dir2b\\logo4.png', 'c:/mydir\\dir2b\\okulov245.pas', 'c:/mydir\\dir2b\\okulov273.pas', 'c:/mydir\\dir2b\\plan1.jpg', 'c:/mydir\\dir2b\\plan2.jpg']
Пример имеет, скорее всего, демонстрирующее, а не практическое значение, т.к. 
результирующий список содержит повторяющиеся части строк. Поэтому лучше напрямую работать с 
кортежем, извлеченным из объекта-генератора.
 
спасибо за инфу!
ОтветитьУдалитьчто за точки с запятыми ?
ОтветитьУдалитьСпасибо, 10 лет php дает о себе знать .
Удалитьспасибо.
ОтветитьУдалитьМне это очень пригодится
удивительно внятная статья, хорошо написана.
ОтветитьУдалитьimages это фильтр, а не переменная, поэтому вот эта часть ошибочная:
ОтветитьУдалить#Фильтруем список
images = filter(lambda x: x.endswith('.jpg'), files)
Теперь в переменной images такой список:
['1.jpg', '2.jpg', '3.jpg']
надо преобразовать в list и будет ок
Удалить#Фильтруем список
images = list(filter(lambda x: x.endswith('.jpg'), files))
Супер статья, очень помогла! А можно узнать как записывать в список только название файла, без типа?
ОтветитьУдалитьнаконец-то все понял, еще в дополнение о чем тут не сказано вот https://pythononline.ru/osnovy/katalogi-python
ОтветитьУдалить