Чтение всех файлов во всех каталогах

У меня есть код, работающий над чтением значений одного текстового файла, но у меня возникают трудности с чтением всех файлов из всех каталогов и объединением всего содержимого.

Вот что у меня есть:

filename = '*'
filesuffix = '*'
location = os.path.join('Test', filename + "." + filesuffix)
Document = filename
thedictionary = {}
with open(location) as f:
 file_contents = f.read().lower().split(' ') # split line on spaces to make a list
 for position, item in enumerate(file_contents): 
     if item in thedictionary:
      thedictionary[item].append(position)
     else:
      thedictionary[item] = [position]
wordlist = (thedictionary, Document)
#print wordlist
#print thedictionary

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

"IOError: [Errno 2] Нет такого файла или каталога: 'Test / .'"

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

У меня заработал этот пример: Python - чтение файлов из каталога файл, не найденный в подкаталоге (который там находится)

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

previous_dir = os.getcwd()
os.chdir('testfilefolder')
#add something here?
for filename in os.listdir('.'):

Что мне нужно добавить что-то там, где у меня есть внешний цикл for, но я не совсем знаю, что в него вставить ...

Есть предположения?


person Relative0    schedule 15.04.2013    source источник


Ответы (1)


Python не поддерживает подстановочные знаки непосредственно в именах файлов для вызова open(). Вам нужно будет использовать glob модуль вместо того, чтобы загружать файлы из одного уровня подкаталогов, или используйте os.walk() для просмотра произвольной структуры каталогов.

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

import glob

for filename in glob.iglob(os.path.join('Test', '*', '*.txt')):
    with open(filename) as f:
        # one file open, handle it, next loop will present you with a new file.

Открытие всех текстовых файлов в произвольной вложенности каталогов:

import os
import fnmatch

for dirpath, dirs, files in os.walk('Test'):
    for filename in fnmatch.filter(files, '*.txt'):
        with open(os.path.join(dirpath, filename)):
            # one file open, handle it, next loop will present you with a new file.
person Martijn Pieters    schedule 15.04.2013
comment
Спасибо, Martijn за это. Я попробую и посмотрю, что получится. Мне любопытно, почему они делают две разные функции glob и os.walk. При небольшом чтении я действительно вижу, что glob позволит вам использовать подстановочные знаки, но os.walk не будет - вместо этого вам нужно отфильтровать результаты. Я не понимаю, что на самом деле происходит, поскольку, когда я думал фильтровать результаты, я думал, что это то, что делали выражения с подстановочными знаками. Я нашел это сообщение: stackoverflow.com/questions / 8931099 / quicker-to-os-walk-or-glob Если у вас есть понимание и время, любые мысли приветствуются. - person Relative0; 15.04.2013
comment
glob() не поддерживает произвольные вложенные подкаталоги (пока). Это единственная разница. os.walk() работает, но требует дополнительной фильтрации. Обратите внимание, что glob() использует тот же метод фильтрации (модуль fnmatch) уже в своей собственной реализации. - person Martijn Pieters; 15.04.2013