Я работаю над сценарием, чтобы рекурсивно просматривать подпапки в основной папке и создавать список из определенного типа файлов. У меня проблема со сценарием. В настоящее время он установлен следующим образом
for root, subFolder, files in os.walk(PATH):
for item in files:
if item.endswith(".txt") :
fileNamePath = str(os.path.join(root,subFolder,item))
проблема в том, что переменная subFolder извлекает список вложенных папок, а не папку, в которой расположен файл ITEM. Раньше я думал запустить цикл for для подпапки и присоединиться к первой части пути, но я подумал, что Id дважды проверит, есть ли у кого-нибудь предложения до этого. Спасибо за вашу помощь!
rglob
это нечувствительно на платформах Windows, но не является нечувствительным к переносимости.glob
тоже работает (здесь Python 3.6):glob.iglob(os.path.join(real_source_path, '**', '*.[xX][mM][lL]')
iglob
не работает для файлов в подпапках или ниже. Вам нужно добавитьrecursive=True
.glob.glob()
получил новый рекурсивный параметр .Если вы хотите получить каждый
.txt
файлmy_path
(рекурсивно включая подкаталоги):Если вам нужен итератор, вы можете использовать iglob в качестве альтернативы:
источник
files = glob.glob(PATH + '/*/**/*.txt', recursive=True)
?Я переведу понимание списка Джона Ла Роя на вложенный for, на всякий случай, если у кого-то еще возникнут проблемы с его пониманием.
Должен быть эквивалентен:
Вот документация по пониманию списка и функциям os.walk и glob.glob .
источник
glob.glob(..., recursive=True)
иlist(Path(dir).glob(...'))
не сделал.Это кажется самым быстрым решением, которое я мог придумать, и оно быстрее
os.walk
и намного быстрее любогоglob
другого решения .f.path
наf.name
(не меняйте его для вложенных папок!).Args:
dir: str, ext: list
.Функция возвращает два списка:
subfolders, files
.См. Ниже подробный анализ скорости.
Анализ скорости
для различных методов, чтобы получить все файлы с определенным расширением во всех подпапках и в основной папке.
tl; dr:
-
fast_scandir
явно выигрывает и в два раза быстрее всех остальных решений, кроме os.walk.-
os.walk
занимает второе место чуть медленнее.- использование
glob
сильно замедлит процесс.- Ни в одном из результатов не используется естественная сортировка . Это означает, что результаты будут отсортированы следующим образом: 1, 10, 2. Чтобы получить естественную сортировку (1, 2, 10), посетите https://stackoverflow.com/a/48030307/2441026
Полученные результаты:
Тесты проводились с W7x64, Python 3.8.1, 20 прогонов. 16596 файлов в 439 (частично вложенных) подпапках.
find_files
находится с https://stackoverflow.com/a/45646357/2441026 и позволяет искать несколько расширений.fast_scandir
был написан мной и также вернет список вложенных папок. Вы можете предоставить ему список расширений для поиска (я тестировал список с одной записью для простого,if ... == ".jpg"
и не было существенной разницы).источник
Новая
pathlib
библиотека упрощает это до одной строки:Вы также можете использовать версию генератора:
Это возвращает
Path
объекты, которые можно использовать практически для чего угодно или получить имя файла в виде строки с помощьюfile.name
.источник
Это не самый питонический ответ, но я поставлю его здесь для удовольствия, потому что это аккуратный урок рекурсии.
На моей машине есть две папки
root
иroot2
Допустим , я хочу , чтобы найти все ,
.txt
и все.mid
файлы в любом из этих каталогов, то я могу просто сделатьисточник
Рекурсивный является новым в Python 3.5, поэтому он не будет работать в Python 2.7. Вот пример, в котором используются
r
строки, поэтому вам просто нужно указать путь, как в Win, Lin, ...Примечание: в нем будут перечислены все файлы, независимо от того, насколько глубоко они должны быть.
источник
Вы можете сделать это таким образом, чтобы вернуть вам список файлов с абсолютными путями.
источник
Если вы не против установить дополнительную библиотеку света, вы можете сделать это:
Использование:
Результат должен выглядеть примерно так:
Он работает как на Python 2.7, так и на Python 3.
Github: https://github.com/kyzas/plazy#list-files
Отказ от ответственности: я автор
plazy
.источник
Эта функция будет рекурсивно помещать в список только файлы. Надеюсь, это будет у вас.
источник
Ваше исходное решение было почти правильным, но переменная «root» динамически обновляется, поскольку она рекурсивно перемещается. os.walk () - рекурсивный генератор. Каждый набор кортежей (корень, вложенная папка, файлы) предназначен для определенного корня, как вы его настроили.
т.е.
Я немного изменил ваш код, чтобы напечатать полный список.
Надеюсь это поможет!
источник