2013-04-15 24 views
7

Mam kod działający na odczyt wartości pojedynczego pliku tekstowego, ale mam trudności z odczytaniem wszystkich plików ze wszystkich katalogów i ze złożeniem całej zawartości.Python: Czytanie wszystkich plików we wszystkich katalogach

Oto co mam:

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 

wiadomości, że staram się trzymać w wieloznacznego * do nazwy pliku, jak również zamiennika dla filesuffix. Pojawia się następujący błąd:

„IOError: [ERRNO 2] Nie ma takiego pliku lub katalogu:« Test/»”

Nie jestem pewien, czy jest to jeszcze właściwy sposób to zrobić, ale wygląda na to, że jeśli w jakiś sposób uruchomię znaki kontrolne - to powinno działać.

Dostałem ten przykład do pracy: Python - reading files from directory file not found in subdirectory (which is there)

który jest trochę inaczej - ale nie wiem, jak zaktualizować go czytać wszystkie pliki. Myślę, że w tym pierwszym zestawie kodu:

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

Że muszę dodać coś gdzie mam zewnętrznej dla pętli, ale nie bardzo wiem, co umieścić w nim ..

Any myśli?

Dzięki dużo,

Brian

Odpowiedz

16

Python nie obsługuje symboli wieloznacznych w nazwach plików bezpośrednio na wezwanie open(). Będziesz potrzebował użyć glob module, aby załadować pliki z jednego poziomu podkatalogów lub użyć os.walk() do przechodzenia w dowolną strukturę katalogów.

Otwieranie wszystkich plików tekstowych we wszystkich podkatalogów, głębokie o jeden poziom:

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. 

Otwieranie wszystkich plików tekstowych w dowolnej zagnieżdżenia katalogów:

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

Dziękuję Martijn za to. Wypróbuję to i zobaczę co się stanie. Ciekawi mnie jednak, dlaczego tworzą dwie różne funkcje glob i os.walk. Na małym czytaniu widzę, że glob pozwoli ci używać symboli wieloznacznych, ale os.walk nie będzie - zamiast tego musisz filtrować wyniki. Nie rozumiem, co tak naprawdę się dzieje, kiedy myślę, że filtruję wyniki, które uważałem za takowe. Znalazłem ten wpis: http://stackoverflow.com/questions/8931099/quicker-to-os-walk-or-glob Jeśli masz jakiś wgląd i czas, wszelkie myśli są doceniane. – Relative0

+0

'glob()' nie obsługuje arbitralnych zagnieżdżonych podkatalogów (jeszcze). To jedyna różnica tutaj. 'os.walk()', ale wymaga więcej filtrowania. Zauważ, że 'glob()' używa * tej samej metody filtrowania * (moduł 'fnmatch') już we własnej implementacji. –

Powiązane problemy