2013-04-15 15 views
7

Ho il codice che funziona per leggere i valori di un singolo file di testo ma ho difficoltà a leggere tutti i file da tutte le directory e a mettere insieme tutti i contenuti.Python: lettura di tutti i file in tutte le directory

Ecco quello che ho:

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 

nota che sto cercando di attaccare il carattere jolly * in per il nome del file, così come il carattere jolly per il filesuffix. Ottengo il seguente errore:

"IOError: [Errno 2] Nessun file o directory: 'Test/'"

Non sono sicuro se questo è anche il modo giusto per farlo, ma sembra che se riesco in qualche modo a far funzionare i caratteri jolly, dovrebbe funzionare.

ho ottenuto questo esempio funzioni: Python - reading files from directory file not found in subdirectory (which is there)

Che è un po 'diverso - ma non sanno come aggiornare per leggere tutti i file. Sto pensando che in questa prima serie di codice:

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

che avrei bisogno di aggiungere qualcosa in cui ho un ciclo for esterno, ma non so bene cosa mettere in esso ..

Qualsiasi pensieri?

Grazie molto,

Brian

risposta

16

Python non supporta i caratteri jolly nei nomi dei file direttamente alla chiamata open(). Dovrai utilizzare lo glob module per caricare file da un singolo livello di sottodirectory oppure utilizzare os.walk() per percorrere una struttura di directory arbitraria.

apertura tutti i file di testo in tutte le sottodirectory, un livello profondo:

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. 

apertura tutti i file di testo in un raggruppamento arbitrario di directory:

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

Grazie Martijn per questo. Lo proverò e vedrò cosa succede. Sono curioso di sapere come perché fanno due diverse funzioni glob e os.walk. In una piccola lettura vedo che glob ti permetterà di usare i caratteri jolly, ma os.walk non lo farà - invece devi filtrare i risultati. Non capisco cosa stia succedendo realmente quando penso che filtri i risultati che ho pensato siano le espressioni jolly. Ho trovato questo post: http://stackoverflow.com/questions/8931099/quicker-to-os-walk-or-glob Se avete qualche intuizione e tempo, qualsiasi pensiero è apprezzato. – Relative0

+0

'glob()' non supporta subdirectory annidate arbitrariamente (ancora). Questa è l'unica differenza qui. 'os.walk()' richiede ma richiede più filtri. Si noti che 'glob()' usa lo * stesso metodo di filtro * (il modulo 'fnmatch') già nella sua implementazione. –

Problemi correlati