Bir qovluqdakı bütün faylları necə sıralaya bilərsiniz?

Python'daki bütün kataloq fayllarını necə sıralayabilir və list əlavə edə bilərəm?

3196
08 июля '10 в 22:31 2010-07-08 22:31 duhhunjonn tərəfindən təyin 8 iyul, '10 10:31 pm 2010-07-08 22:31
@ 40 cavab
  • 1
  • 2

os.listdir() olan hər şeyi təmin edəcək - fayllar və qovluqlar.

Yalnız faylları istəsəniz, bunu os.path istifadə edərək os.path :

 from os import listdir from os.path import isfile, join onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))] 

və ya hər bir ziyarət edilən kataloq üçün iki siyahı verəcək - os.walk() istifadə edə bilərsiniz - fayllara bölünür və sizin üçün. Yalnız üst kataloqa ehtiyacınız varsa, yalnız ilk dəfə verə bilərsiniz

 from os import walk f = [] for (dirpath, dirnames, filenames) in walk(mypath): f.extend(filenames) break 

Nəhayət, bu nümunədə göstərildiyi kimi, bir siyahısını başqa birinə əlavə edərək, ya da .extend() və ya istifadə edə bilərsiniz

 >>> q = [1, 2, 3] >>> w = [4, 5, 6] >>> q = q + w >>> q [1, 2, 3, 4, 5, 6] 

Şəxsən mən üstünlük verirəm .extend()

3160
09 июля '10 в 0:01 2010-07-09 00:01 Cavab 09 iyul 2010 - cu il saat 09: 00 -da başlayacaq

Mən glob istifadə etməyi üstün edirəm, çünki bu model uyğunlaşır və genişləndirir.

 import glob print(glob.glob("/home/adam*.gif ) и может содержать подстановочные знаки в стиле оболочки. Сломанные символические ссылки включены в результаты (как в оболочке). 
...
Изменено в версии 3.5 : Поддержка рекурсивных глобусов с использованием " ** ".


[Python 3]: class pathlib. Путь (* pathsegments) (Python 3.4 +, обратный порт : [PyPI]: pathlib2 ) 

[Python 2]: dircache.listdir (путь) (только Python 2 ) 


[man7]: OPENDIR (3) / [man7]: READDIR (3) / [man7]: CLOSEDIR (3) через [Python 3]: ctypes - библиотека сторонних функций для Python (специфична для POSIX) 

ctypes - это библиотека внешних функций для Python. Он предоставляет C-совместимые типы данных и позволяет вызывать функции в DLL или общих библиотеках. Это может быть использовано, чтобы обернуть эти библиотеки в чистый Python.

code_ctypes.py:

[man7]: dirent.h(0P) (как и константы DT_) с моей машины: Ubtu 16 x64 (4.10.0-40-generic и libc6-dev: amd64). В других вариантах/версиях определение структуры может отличаться, и если это так, псевдоним ctypes должен быть обновлен, в противном случае он приведет к неопределенному поведению 
  • Возвращает данные в формате os.walk . Я не удосужился сделать его рекурсивным, но, исходя из существующего кода, это было бы довольно тривиальной задачей
  • На Win все также выполнимо, данные (библиотеки, функции, структуры, константы,...) отличаются

  • Выход :

    [ActiveState]: win32file.FindFilesW ( зависит от Win) 

    Получает список совпадающих имен файлов с помощью Windows Unicode API. Интерфейс для API FindFirstFileW/FindNextFileW/Find close functions.


    [GitHub]: mhammond/pywin32 - расширения Python для Windows (pywin32) , являющиеся оболочкой Python поверх WINAPI 
  • Ссылка на документацию от ActiveState , так как я не нашел никакой официальной документации pywin32

    1. Установите какой-нибудь (другой) сторонний пакет, который делает свое дело
      • Скорее всего, будет опираться на один (или несколько) из вышеперечисленных (возможно, с небольшими настройками)


    Примечания :

    • Код должен быть переносимым (кроме мест, предназначенных для определенной области - которые отмечены) или крестиком:

      • платформа (Nix, Win,)
      • Версия Python (2, 3,)
    • Множество стилей пути (абсолютные, родственники) были использованы в вышеупомянутых вариантах, чтобы проиллюстрировать тот факт, что используемые "инструменты" являются гибкими в этом направлении

    • os.listdir и os.scandir используют opendir/readdir/closedir ( [MS.Docs]: функция FindFirstFileW / [MS.Docs]: функция FindNextFileW / [MS.Docs]: функция FindClose ) (через [GitHub]: python/cpython - (мастер) cpython/Modules/posixmodule.c )

    • win32file.FindFilesW использует эти (специфичные для Win) функции (через [GitHub]: mhammond/pywin32 - (master) pywin32/win32/src/win32file.i )

    • _get_dir_content (из пункта №1. ) может быть реализован с использованием любого из этих подходов (некоторые потребуют больше работы, а некоторые меньше)

      • Может быть проделана некоторая расширенная фильтрация (вместо просто file vs. dir): например, аргумент include_folders может быть заменен другим (например, filter_func), который будет функцией, которая принимает путь в качестве аргумента: filter_func=lambda x: True ( это ничего не убирает) и внутри _get_dir_content что-то вроде: if not filter_func(entry_with_path): continue (если функция завершается с ошибкой для одной записи, она будет пропущена), но чем сложнее код, тем дольше он займет выполнить
    • Нота бене! Поскольку используется рекурсия, я должен упомянуть, что я провел несколько тестов на своем ноутбуке (Win 10 x64), совершенно не связанных с этой проблемой, и когда уровень рекурсии достигал значений где-то в диапазоне (990.. 1000) (предел рекурсии - 1000 (по умолчанию)), я получил StackOverflow :). Если дерево каталогов превышает этот предел (я не эксперт FS, поэтому я не знаю, возможно ли это вообще), это может быть проблемой.
      Я должен также упомянуть, что я не пытался увеличить предел рекурсии, потому что у меня нет опыта в этой области (насколько я могу увеличить его, прежде чем придется увеличивать стек на уровне ОС), но в теории всегда будет возможность ошибка, если глубина dir больше максимально возможного предела рекурсии (на этой машине)

    • Примеры кода приведены только для демонстрации. Это означает, что я не принимал во внимание обработку ошибок (я не думаю, что есть какой- либо блок try / кроме / else / finally ), поэтому код не является устойчивым (причина в том, чтобы сделать его максимально простым и коротким, насколько это возможно).). Для производства должна быть добавлена обработка ошибок

    Другие подходы:

    1. Используйте Python только в качестве оболочки

      • Все сделано с использованием другой технологии
      • Эта технология вызывается из Python
      • Самый известный вариант, который я знаю, это то, что я называю подходом системного администратора:

        • Используйте Python (или любой другой язык программирования в этом отношении) для выполнения команд оболочки (и анализа их выходных данных)
        • Некоторые считают это аккуратным взломом
        • Я считаю, что это больше похоже на неудачный обходной путь (gainarie), поскольку само по себе действие выполняется из оболочки (в данном случае cmd) и, следовательно, не имеет ничего общего с Python.
        • Фильтрация ( grep / findstr ) или форматирование вывода могут быть выполнены с обеих сторон, но я не буду настаивать на этом. Кроме того, я намеренно использовал os.system вместо subprocess.Popen .
        35
    ответ дан CristiFati 23 янв. '18 в 6:09 2018-01-23 06:09
     def list_files(path): # returns a list of names (with extension, without full path) of all files # in folder path files = [] for name in os.listdir(path): if os.path.isfile(os.path.join(path, name)): files.append(name) return files 
    34
    ответ дан Apogentus 10 июня '14 в 19:16 2014-06-10 19:16

    Вы должны использовать модуль os для размещения содержимого каталога. os.listdir(".") возвращает все содержимое каталога. Мы перебираем результат и добавляем его в список.

     import os content_list = [] for content in os.listdir("."): # "." means current directory content_list.append(content) print content_list 
    27
    ответ дан Harun ERGUL 23 марта '16 в 13:09 2016-03-23 13:09
     import os lst=os.listdir(path) 

    os.listdir возвращает список, содержащий имена записей в каталоге, заданном путем.

    22
    ответ дан Rajat Garg 07 июля '15 в 13:12 2015-07-07 13:12

    Если вы ищете реализацию find на Python, это рецепт, который я использую довольно часто:

     from findtools.find_files import (find_files, Match) # Recursively find all *.sh files in **/usr/bin** sh_files_pattern = Match(filetype='f', name='*.sh') found_files = find_files(path='/usr/bin', match=sh_files_pattern) for found_file in found_files: print found_file 

    Итак, я сделал из него PyPI пакет , а также есть Репозиторий GitHub . Я надеюсь, что кто-то найдет это потенциально полезным для этого кода.

    21
    ответ дан Yauhen Yakimovich 10 апр. '14 в 17:09 2014-04-10 17:09

    Python 3.5 представил новый, более быстрый метод для os.scandir() по каталогу - os.scandir() .

    Məsələn:

     for file in os.scandir('/usr/bin'): line = '' if file.is_file(): line += 'f' elif file.is_dir(): line += 'd' elif file.is_symlink(): line += 'l' line += '\t' print("{}{}".format(line, file.name)) 
    15
    ответ дан enedil 17 янв. '16 в 21:17 2016-01-17 21:17

    Возврат списка абсолютных путей к файлу, не рекурсивно вложенные подкаталоги

     L = [os.path.join(os.getcwd(),f) for f in os.listdir('.') if os.path.isfile(os.path.join(os.getcwd(),f))] 
    12
    ответ дан The2ndSon 13 июня '14 в 19:26 2014-06-13 19:26

    Список всех файлов в каталоге:

     import os from os import path files = [x for x in os.listdir(directory_path) if path.isfile(directory_path+os.sep+x)] 

    Здесь вы получаете список всех файлов в каталоге.

    12
    ответ дан shiminsh 29 авг. '15 в 20:44 2015-08-29 20:44
     import os import os.path def get_files(target_dir): item_list = os.listdir(target_dir) file_list = list() for item in item_list: item_dir = os.path.join(target_dir,item) if os.path.isdir(item_dir): file_list += get_files(item_dir) else: file_list.append(item_dir) return file_list 

    Здесь я использую рекурсивную структуру.

    9
    ответ дан pah8J 19 июня '18 в 15:03 2018-06-19 15:03

    Я предполагаю, что все ваши файлы имеют формат *.txt и хранятся внутри каталога с data/ пути data/ .

    Можно использовать модуль glob python для перечисления всех файлов каталога и добавления их в список с именами fnames следующим образом:

     import glob fnames = glob.glob("data*.py') if not f.is_symlink()] 
    3
    ответ дан fhchl 28 марта '18 в 15:20 2018-03-28 15:20

    Выполните findfiles() с каталогом в качестве параметра, и он вернет список всех файлов в нем.

     import os def findfiles(directory): objects = os.listdir(directory) # find all objects in a dir files = [] for i in objects: # check if very object in the folder ... if os.path.isfile(os.path.join(directory, i)): # ... is a file. files.append(i) # if yes, append it. return files 
    3
    ответ дан phyyyl 24 февр. '18 в 20:28 2018-02-24 20:28

    Действительно простая версия:

     import os [f for f in os.listdir(os.getcwd) if ...] 
    2
    ответ дан Jared Shulman 08 мая '18 в 19:27 2018-05-08 19:27

    Здесь моя универсальная функция для этого. Он возвращает список путей к файлам, а не имена файлов, так как я обнаружил, что это более полезно. Он содержит несколько дополнительных аргументов, которые делают его универсальным. Например, я часто использую его с такими аргументами, как pattern='*.txt' или subfolders=True .

     import os import fnmatch def list_paths(folder='.', pattern='*', case_sensitive=False, subfolders=False): """Return a list of the file paths matching the pattern in the specified folder, optionally including files inside subfolders. """ match = fnmatch.fnmatchcase if case_sensitive else fnmatch.fnmatch walked = os.walk(folder) if subfolders else [next(os.walk(folder))] return [os.path.join(root, f) for root, dirnames, filenames in walked for f in filenames if match(f, pattern)] 
    1
    ответ дан MarredCheese 07 дек. '17 в 23:10 2017-12-07 23:10
    • 1
    • 2

    Другие вопросы по меткам или Задайте вопрос