Python: найти все файлы в каталоге рекурсивно? [Дубликат]

137
задан Bhavesh Gangani 17 May 2015 в 20:04
поделиться

4 ответа

Убедитесь, что вы понимаете три значения возврата os.walk:

for root, subdirs, files in os.walk(rootdir):

имеет следующее значение:

  • root: Текущий путь, который является "

  • subdirs: файлы в root каталога типов
  • files: файлы в root (не в subdirs) типа, отличного от каталога

И используйте os.path.join вместо конкатенации косой чертой! Ваша проблема - filePath = rootdir + '/' + file - вы должны соединить текущую папку «walk» вместо самой верхней папки. Таким образом, это должно быть filePath = os.path.join(root, file). «Файл» BTW является встроенным, поэтому вы обычно не используете его как имя переменной.

Еще одна проблема - это ваши циклы, которые должны быть такими, например:

import os
import sys

walk_dir = sys.argv[1]

print('walk_dir = ' + walk_dir)

# If your current working directory may change during script execution, it's recommended to
# immediately convert program arguments to an absolute path. Then the variable root below will
# be an absolute path as well. Example:
# walk_dir = os.path.abspath(walk_dir)
print('walk_dir (absolute) = ' + os.path.abspath(walk_dir))

for root, subdirs, files in os.walk(walk_dir):
    print('--\nroot = ' + root)
    list_file_path = os.path.join(root, 'my-directory-list.txt')
    print('list_file_path = ' + list_file_path)

    with open(list_file_path, 'wb') as list_file:
        for subdir in subdirs:
            print('\t- subdirectory ' + subdir)

        for filename in files:
            file_path = os.path.join(root, filename)

            print('\t- file %s (full path: %s)' % (filename, file_path))

            with open(file_path, 'rb') as f:
                f_content = f.read()
                list_file.write(('The file %s contains:\n' % filename).encode('utf-8'))
                list_file.write(f_content)
                list_file.write(b'\n')

Если вы не знали, инструкция with для файлов является сокращением:

with open('filename', 'rb') as f:
    dosomething()

# is effectively the same as

f = open('filename', 'rb')
try:
    dosomething()
finally:
    f.close()
248
ответ дан AndiDog 24 August 2018 в 03:25
поделиться

Если вы используете Python 3.5+ или выше, вы можете сделать это в 1 строке.

import glob

for filename in glob.iglob(root_dir + '**/*.txt', recursive=True):
     print(filename)

Как упоминалось в документации

Если рекурсивное значение истинно, шаблон «**» будет соответствовать любым файлам и ноль или более каталогам и подкаталогам.

Если вы хотите каждый файл, вы можете использовать

import glob

for filename in glob.iglob(root_dir + '**/*', recursive=True):
     print(filename)
22
ответ дан ChillarAnand 24 August 2018 в 03:25
поделиться

Попробуйте следующее:

import os
import sys

for root, subdirs, files in os.walk(path):

    for file in os.listdir(root):

        filePath = os.path.join(root, file)

        if os.path.isdir(filePath):
            pass

        else:
            f = open (filePath, 'r')
            # Do Stuff
1
ответ дан Diego 24 August 2018 в 03:25
поделиться

Я думаю, проблема в том, что вы не обрабатываете вывод os.walk правильно.

Сначала измените:

filePath = rootdir + '/' + file

на:

filePath = root + '/' + file

rootdir - ваш фиксированный каталог запуска; root - это каталог, возвращаемый os.walk.

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

30
ответ дан the Tin Man 24 August 2018 в 03:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: