2017-01-01 8 views
0

Я хочу перечислить все папки, содержащие docx, используя os() .walk метод в Python 2.7. Мне удалось сделать это с помощью кода, написанного ниже, но я хочу знать, можно ли ограничить этот список, чтобы показывать только папки, содержащие ровно два определенных типа файлов (например, «docx» и «pdf»)?с использованием метода os.walk для получения путей к каталогам, содержащих 2 типа файлов

import os 
import walk 

a = open("output.txt", "w") 
for path, subdirs, files in os.walk(r'C:\Users\Stephen\Desktop'): 
    for filename in files: 
     if filename.endswith(('.docx')): 
      f = os.path.join(path, filename) 
      a.write(str(f) + os.linesep) 

ответ

2

Просто пропустите каталоги, в которых у вас нет хотя бы этих двух расширений; в-справочник списки файлов ограничены, так что это дешево использовать any() для проверки конкретных расширений:

for path, subdirs, files in os.walk(r'C:\Users\Stephen\Desktop'): 
    if not (any(f.endswith('.pdf') for f in files) and 
      any(f.endswith('.docx') for f in files)): 
     # no PDF or Word files here, skip 
     continue 
    # directory contains *both* PDF and Word documets 

Когда список расширений для тестирования для становится немного больше, вы можете просто создать набор всех доступных расширения:

for path, subdirs, files in os.walk(r'C:\Users\Stephen\Desktop'): 
    extensions = {os.path.splitext(f)[-1] for f in files} 
    if not extensions >= {'.pdf', '.docx', '.odt', '.wpf'}: 
     # directory doesn't contain *all* required file types 
     continue 

>= тесты, если множество правая является подмножеством левой (так extensions является superset of the right-hand set); так extensions должны по крайней мере содержат все для расширения имени на праве:

>>> {'.foo', '.docx', '.pdf', '.odt'} >= {'.pdf', '.docx', '.odt', '.wpf'} # missing .wpf 
False 
>>> {'.foo', '.wpf', '.docx', '.pdf', '.odt'} >= {'.pdf', '.docx', '.odt', '.wpf'} # complete 
True 
+0

Спасибо! Второй пример работал как шарм. – stjepan

+0

Могу ли я добавить условие, что файлы docx и pdf должны начинаться с цифры, используя метод isdigit? – stjepan

+0

@stjepan: уверенный вы можете. 'f [0] .isdigit()' будет проверять, есть ли первый символ, это цифра. Возможно, вам придется переделать все ваши тесты, чтобы охватить несколько аспектов. –

0

этом?

import os 

a = open("output.txt", "w") 
for path, subdirs, files in os.walk(r'C:\Users\Stephen\Desktop'): 
    docx = False 
    pdf = False 
    rest = True 
    for filename in files: 
     if filename.endswith(('.docx')): 
      docx = True 
     elif filename.endswith(('.pdf')): 
      pdf = True 
     else: 
      rest = False 
      break 
    if docx and pdf and rest: 
     f = os.path.join(path, filename) 
     a.write(str(f) + os.linesep) 
+0

Спасибо, это сработало. Мне пришлось удалить «, filename» из f = os.path.join (путь, имя файла), чтобы получить только путь. – stjepan