Os.walk на каталоге дисков без C

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

import os
 file_list = []
 for (paths, dirs, files) in os.walk(folder):
 for file in files:
 if file.endswith(".mxd"):
 file_list.append(os.path.join(paths, file))

Однако он работает только на диске C. Мне нужно иметь возможность искать эти файлы на сопоставленном диске по своему выбору. Здесь сценарий, который я использую, но он не работает. Я знаю, что есть файл mxd в подкаталоге этого диска, но он не сообщается в списке файлов. Фактически, список файлов полностью пуст, и этого не должно быть.

import os
 path = r"U:/TEST/"
 filenamelist = []
 for files in os.walk(path):
 if file.endswith(".mxd"):
 filenamelist.append(files)

Кто-то видит что-то не так в моем втором блоке кода, который прокручивал бы его из итерации по подкаталогам по заданному пути и отправлял обратно файлы с расширением.mxd?

3 ответа

Кто-то видит что-то не так в моем втором блоке кода, который прокручивал бы его из итерации по подкаталогам по заданному пути и отправлял обратно файлы с расширением.mxd?

Да. Сравните и сравните ваши две циклы:

for (paths, dirs, files) in os.walk(folder):
 for file in files:
 if file.endswith(".mxd"):
 file_list.append(os.path.join(paths, file))

for files in os.walk(path):
 if file.endswith(".mxd"):
 filenamelist.append(files)

Вы пытаетесь сделать то же самое, но не используете даже отдаленно тот же код.

В первом вы зацикливаетесь на walk, сохраняя каждый кортеж в (paths, dirs, files), затем перебираете files.

Во втором вы зацикливаетесь на walk, сохраняете каждый кортеж в files, не зацикливаетесь на что-либо, а затем просто используете некоторый file именем переменной, оставшийся от предыдущего кода.

И тогда, даже если эта часть работала, вы в конечном итоге добавляете files (которые, помните, это кортеж из трех списков), а не file -или, возможно, лучше, os.path.join(paths, file) - в список.

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


os.walk(path) дает 3-кортеж, который обычно распаковывается как root, dirs, files. Поэтому вместо

for files in os.walk(path):
 ...

использование

for root, dirs, files in os.walk(path):
 for filename in files:
 if filename.endswith(".mxd"):
 filenamelist.append(filename)


Здесь последний скрипт, который работал для сканирования на корневом диске, отличном от C:

import os
file_list = []
path = r'U:\\'
for (dirpath, subdirs, files) in os.walk(path):
 for file in files:
 if file.endswith(".mxd"):
 file_list.append(os.path.join(dirpath, file))

licensed under cc by-sa 3.0 with attribution.