2014-01-17 5 views
-1

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

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) 

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

ответ

1

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) 
+0

unutbu, это работает. Но когда я указываю путь, такой как r'U: \\ ', в результате перечисляется путь с четырьмя обратными косыми чертами после буквы буквы U и двумя обратными косыми чертами после каждой папки. Есть ли способ немного почистить это. Мой скрипт должен сканировать, начиная с корня диска. – user23469

+0

Ну ... Думаю, у ArcGIS нет проблем с четырьмя обратными косыми чертами после буквы диска. Выглядит странно, но это работает. Спасибо за вашу помощь!! – user23469

+0

Что вы видите, это escape-последовательность. '' \\ ''- это Python' str', представляющий * one * обратную косую черту.См. Страницу документа [«Строковые литералы»] (http://docs.python.org/2/reference/lexical_analysis.html#string-literals). – unutbu

1

Видит ли кто-то ничего плохого в моем втором блоке коды, который бы ProVent его из итерации подкаталогов на данном пути и отчетные файлы с. расширение 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 -or, вероятно, лучше, os.path.join(paths, file) -в списке.

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

0

Вот окончательный скрипт, который работал для обхода на корне диска, кроме 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))