Наука о данных

3 способа сэкономить время, чтобы получить все файлы в каталоге с помощью Python

Всегда есть способ, который вы ищете

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

Вы когда-нибудь искали в Google «Как просмотреть список всех файлов каталога?» или «Найти все файлы CSV в каталоге с помощью Python».»?

Тогда эта статья станет универсальным решением для всех ваших вопросов.

Будучи профессиональным аналитиком, я использую Python в своей повседневной работе. Часто мне нужно вытащить все файлы из папки и подпапки. И я уверен, что вы тоже сталкивались с подобной ситуацией.

Поэтому я суммировал 3 быстрых способа получить все файлы из каталога или подкаталога. И всегда есть способ, который точно соответствует вашим требованиям.

Для примера я использую приведенный ниже шаблон папок.

Jupyter-Notebook, который будет читать содержимое папки 01_Main_Directory, находится в папке Challenges.

Давайте начнем..

В зависимости от вашей задачи вы можете использовать один или комбинацию нескольких способов, указанных ниже.

Я бы начал с самого простого способа.

Предположим, вы хотите вывести список всех файлов, находящихся в папке 01_Main_Directory. Таким образом, вы можете использовать функцию, которая буквально говорит о своей цели в имени, т.е. listdir()

os.listdir()

Модуль Python os предоставляет эту функцию, и, как следует из его названия, вы можете получить список всех файлов, папок и подпапок, присутствующих в пути.

Перед использованием этой функции не забудьте импортировать модуль os. В этом примере, чтобы перечислить все файлы, находящиеся в 01_Main_Directory, все, что вам нужно сделать, это указать путь к этой папке в функции os.listdir(). Если этой папки нет в вашем текущем пути, то вам нужно добавить ее в путь.

Но как мне получить текущий путь??

Вы можете использовать другую функцию os.getcwd() для получения текущего пути.

import os
os.getcwd()

#Output
'C:\\Users\\Suraj\\Challenges'

Как видите, текущий путь указывает на папку Challenges, в которой хранится этот Juputer-Notebook.

Вам нужно добавить папку 01_Main_Directory в этот путь вручную, чтобы получить список всех файлов в ней, как показано ниже.

import os
os.listdir(os.getcwd()+'\\01_Main_Directory')

#Output
['ABCD_1.docx',
 'ABCD_1.txt',
 'ABCD_2.txt',
 'ABCD_3.txt',
 'ABCD_4.txt',
 'ABCD_5.txt',
 'ABCD_5.xlsx',
 'Sub_Dictionary_1',
 'Sub_Dictionary_2']

Простой! Вы получили список всех файлов в папке.

Этот список содержит все файлы и подпапки, присутствующие в указанном пути.

В качестве альтернативы, чтобы получить список всех папок, подпапок и файлов в подпапке, вы можете использовать более сложную функцию из модуля os.

os.walk()

Как следует из названия, эта функция буквально проведет вас по дереву каталогов.

Этот метод в Python работает аналогично os.listdir(), но вместо списка всего содержимого по указанному пути os.walk() возвращает кортеж из 3 элементов, который содержит —

  1. folder_path: Путь к текущей папке и ко всем папкам, присутствующим в текущей папке.
  2. folders: Список папок или каталогов по указанному пути
  3. files: Список файлов, присутствующих в указанном пути к каталогу и его подкаталогах.

Давайте посмотрим на эту функцию в действии для облегчения понимания!

path = os.getcwd()+'\\01_Main_Directory'
for folder_path, folders, files in os.walk(path):
    print(folder_path)

Первой строкой вывода всегда будет путь к текущему каталогу или путь, указанный в качестве входных данных для os.walk(). Далее следует путь к подкаталогам в алфавитном порядке.

Чтобы получить список всех папок по указанному пути, вы можете использовать вторую переменную в объекте генератора os.walk(), как показано ниже.

path = os.getcwd()+'\\01_Main_Directory'
for folder_path, folders, files in os.walk(path):
    print(folders)

аналогично folder_path, первая строка этого вывода будет списком всех подпапок, присутствующих в указанном пути. Во второй и третьей строке перечислены папки, находящиеся в этих подпапках.

В этом примере в Sub_Dictionary_1 и Sub_Dictionary_2 нет папок. Таким образом, оставшиеся строки вывода показывают пустые списки.

Точно так же, используя последний элемент кортежа, вы можете получить все файлы, присутствующие в пути.

path = os.getcwd()+'\\01_Main_Directory'
for folder_path, folders, files in os.walk(path):
    print(files)

Поскольку все файлы присутствуют только в 01_Main_Directory, в первой строке вывода перечислены все файлы.

Это особенно полезно, когда вы просто хотите увидеть, какие файлы присутствуют в папке. Для работы с этими файлами вам понадобится путь к файлу.

И здесь вам поможет другой модуль — glob.

glob — Расширение шаблона пути в стиле Unix

Этот модуль полезен для путей к файлам, которые соответствуют определенному шаблону, указанному в функции glob() в модуле Python glob. Шаблон, который вы должны указать в функции glob(), должен соответствовать правилам расширения пути Unix.

Чтобы получить путь к файлам в последующих папках, все, что вам нужно сделать, это указать путь к папке, в которой вы сохранили файлы. И вы можете указать как абсолютный, так и относительный путь к файлу.

Например, предположим, что вы хотите получить все файлы в пределах 01_Main_Directory, все, что вам нужно сделать, это указать путь к этой папке.

import glob
path = os.getcwd()+'\\01_Main_Directory'
for filepath in glob.glob(path):
    print(filepath)

#Output
C:\Users\Suraj\Challenges\01_Main_Directory

Это просто вернуло путь к 01_Main_Directory, потому что путь, указанный в glob.glob(), заканчивается этой папкой.

Чтобы получить все файлы, вы должны указать путь, выходящий за пределы этой папки, как показано ниже.

path = os.getcwd()+'\\01_Main_Directory\\*'
for filepath in glob.glob(path):
    print(filepath)

#Output
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_1.docx
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_1.txt
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_2.txt
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_3.txt
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_4.txt
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_5.txt
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_5.xlsx
C:\Users\Suraj\Challenges\01_Main_Directory\Sub_Dictionary_1
C:\Users\Suraj\Challenges\01_Main_Directory\Sub_Dictionary_2

Как видите, путь здесь расширен, чтобы войти внутрь папки 01_Main_Directory с помощью \\*. Здесь звездочка (*) — это подстановочный знак, обозначающий выбор всех файлов в папке.

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

Например, предположим, что вы хотите получить пути ко всем файлам из этой папки, которые содержат строку 1 в своем имени. Вы можете использовать функцию glob() очень простым способом, как показано ниже.

path = os.getcwd()+'\\01_Main_Directory\\*1.*'
for filepath in glob.glob(path):
    print(filepath)

#Output
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_1.docx
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_1.txt

Это извлекло все имена файлов, в имени которых есть 1, но вывод содержит все типы файлов.

Что делать, если вы хотите вытащить из папок только файлы .txt ??

Как и в случае с вариантом использования, который вы видели выше, вам нужно написать шаблон. Конечно, файлы .txt будут иметь .txt в конце. И вы хотите получить все файлы, чтобы использовать подстановочную звездочку (*). Таким образом, в glob() указан шаблон *.txt, и вы можете использовать его, как показано ниже.

path = os.getcwd()+'\\01_Main_Directory\\*.txt'
for filepath in glob.glob(path):
    print(filepath)

#Output
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_1.txt
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_2.txt
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_3.txt
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_4.txt
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_5.txt

Бинго!! Вы получили путь ко всем текстовым файлам в папке. Точно так же, чтобы получить все файлы .docx, вам необходимо указать шаблон *.docx в файле glob().

Забегая вперед, предположим, что вы хотите получить все файлы в подпапках — Sub_Disctionary_1 и Sub_Dictionary_2, а затем glob() — самая полезная функция.

Все, что вам нужно сделать, это использовать подстановочный знак ** в пути. Здесь нужно установить параметр recursive=True, как показано ниже.

path = os.getcwd()+'\\01_Main_Directory\\**\\*.txt'
for filepath in glob.glob(path, recursive=True):
    print(filepath)

#Output
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_1.txt
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_2.txt
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_3.txt
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_4.txt
C:\Users\Suraj\Challenges\01_Main_Directory\ABCD_5.txt
C:\Users\Suraj\Challenges\01_Main_Directory\Sub_Dictionary_1\File01_Main_Directoryin_SubDict_1.txt
C:\Users\Suraj\Challenges\01_Main_Directory\Sub_Dictionary_1\FileChallengesin_SubDict_1.txt
C:\Users\Suraj\Challenges\01_Main_Directory\Sub_Dictionary_2\File01_Main_Directoryin_SubDict_2.txt
C:\Users\Suraj\Challenges\01_Main_Directory\Sub_Dictionary_2\FileChallengesin_SubDict_2.txt

Шаблон ** в пути будет соответствовать всем каталогам и файлам, присутствующим в папке 01_Main_Dictionary .

Вот и все!

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

Конечно, может быть больше инструментов из разных пакетов Python, таких как pathlib и os.scandir() , но вышеупомянутые три функции просты и широко используются.

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

Вы можете использовать мою реферальную ссылку ниже, чтобы присоединиться к Medium. Это поможет мне и другим авторам, так как Medium делится с нами крошечной частью ваших 5 долларов.



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

Спасибо за чтение!