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

main
  |- A
    |- 1.txt
    |- 2.txt
  |- B
    |- 3.txt
    |- C
      |- 4.txt

Это могут быть изображения, аудиофайлы, файлы CSV или все, что вы хотите проанализировать, но в демонстрационных целях я буду использовать файлы .txt. Здесь основная папка содержит несколько файлов .txt в разных папках.

Функция os.walk

Функция os.walk по сути просматривает все в папке "main" - каждый файл, папку, подпапку и файл в каждой подпапке.

import os
for root, subfolders, filenames in os.walk("main"):
    print(root, subfolders, filenames)

Функция os.walk генерирует 3 переменные - root, subfolders и filenames..

root - строковое значение, относящееся к пути к файлу, начиная с папки "main"

subfolders - это список, содержащий строки, и каждая строка относится к подпапке внутри root

filenames - это список, содержащий строки, и каждая строка относится к имени файла внутри root

Получение каждого файла .txt внутри main

Чтобы получить путь к каждому файлу внутри папки, мы можем просто объединить root и filename вместе.

import os
for root, subfolders, filenames in os.walk("main"):
    for filename in filenames:
        filepath = root + "/" + filename
        print(filepath)
        # do stuff with filepath

Работа с файлами, которые нам не важны

Иногда по какой-то причине у нас могут быть случайные автоматически сгенерированные файлы - __pycache__, .DS_Store и все такое прочее. Чтобы наш код не прочитал их случайно, мы можем использовать простой оператор if, чтобы отфильтровать их.

import os
for root, subfolders, filenames in os.walk("main"):
    for filename in filenames:
        filepath = root + "/" + filename
        print(filepath)
        if filename[-4:] != ".txt":
            continue
 
        # do stuff with filepath

Заключение

Если вы еще не знали об этой функции, надеюсь, это облегчит вам жизнь!

Больше контента на plainenglish.io