Как исключить расширение файлов из os.walk

Я хотел бы искать файлы, кроме тех, которые содержат файл .txt. Как это сделать ? На данный момент мой код ищет файлы с расширением .txt. Как сделать наоборот?

src = raw_input("Enter source disk location: ")
src = os.path.abspath(src)
print "src--->:",src
for dir,dirs,_ in os.walk(src, topdown=True):

    file_path = glob.glob(os.path.join(dir,"*.txt"))

person Wiktor    schedule 09.02.2016    source источник


Ответы (1)


Отфильтруйте свои файлы с пониманием списка:

for dir, dirs, files in os.walk(src):
    files = [os.path.join(dir, f) for f in files if not f.endswith('.txt')]

Я удалил аргумент topdown=True; это значение по умолчанию.

Не используйте glob.glob() в сочетании с os.walk(); оба метода запрашивают у операционной системы имена файлов в каталоге. У вас уже есть эти имена файлов в третьем значении каждой итерации более os.walk().

Если вы хотите пропустить весь каталог, используйте any() функцию, чтобы увидеть если есть какие-либо совпадающие файлы, используйте continue игнорировать этот каталог:

for dir, dirs, files in os.walk(src):
    if any(f.endswith('.txt') for f in files):
        continue  # ignore this directory

    # do something with the files here, there are no .txt files.
    files = [os.path.join(dir, f) for f in files]

Если вы хотите игнорировать этот каталог и все его потомки, также очистите переменную dirs, используя назначение фрагмента:

for dir, dirs, files in os.walk(src):
    if any(f.endswith('.txt') for f in files):
        dirs[:] = []  # do not recurse into subdirectories
        continue      # ignore this directory

    # do something with the files here, there are no .txt files.
    files = [os.path.join(dir, f) for f in files]
person Martijn Pieters    schedule 09.02.2016
comment
А что, если файлы .txt существуют в подкаталогах, например, data----› папка -----› test.txt, и я хочу исключить только подкаталог? - person Wiktor; 09.02.2016
comment
@WiktorKostrzewski: значит, вы хотите пропустить любой каталог, в котором есть файл .txt? - person Martijn Pieters; 09.02.2016
comment
Точно :) это моя цель - person Wiktor; 09.02.2016
comment
мне нужен только список подкаталогов, в которых нет .txt. Моя цель - отфильтровать эти подкаталоги. Кроме того, я хочу переместить их в другую позицию. Я уже сделал это для каталогов, содержащих .txt. - person Wiktor; 09.02.2016
comment
поэтому, чтобы перемещать каталоги без .txt, я должен использовать в этом цикле Shutil? - person Wiktor; 10.02.2016
comment
@WiktorKostrzewski: подкаталоги тоже есть? Возможно, соберите пути к каталогам в список, а затем на следующем шаге переместите все соответствующие каталоги. - person Martijn Pieters; 10.02.2016
comment
Это именно то, что я искал. Я ценю вашу помощь. Спасибо чувак :) - person Wiktor; 10.02.2016