2013-04-15 154 views
7

我有代碼工作讀取單個文本文件的值,但是難以讀取所有目錄中的所有文件並將所有內容放在一起。Python:讀取所有目錄中的所有文件

以下是我有:

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 

請注意,我儘量堅持通配符*在文件名以及作爲filesuffix通配符。我收到以下錯誤:

「IO錯誤:[錯誤2]沒有這樣的文件或目錄:‘測試/ ’」

我不知道這是否是連做正確的方式,但似乎如果我以某種方式讓通配符工作 - 它應該工作。

我已經得到了這個例子的工作:Python - reading files from directory file not found in subdirectory (which is there)

這是一個有點不同 - 但不知道如何更新它讀取的所有文件。我想,在這第一組代碼:

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

,我需要補充的東西在那裏我有for循環外,但不太知道該怎麼把它..

任何想法?

謝謝了,

布賴恩

回答

16

Python不直接支持文件名中的open()呼叫通配符。您需要使用glob module來代替從單個級別的子目錄加載文件,或使用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. 
+0

謝謝你的Martijn了點。我會試試看看會發生什麼。我很好奇,爲什麼他們做了兩個不同的函數glob和os.walk。在一些小小的閱讀中,我會看到glob會讓你使用通配符,但os.walk不會 - 你需要過濾結果。我不明白到底發生了什麼,因爲當我想過濾結果時,我認爲這是通配符表達式所做的。我發現這個職位: http://stackoverflow.com/questions/8931099/quicker-to-os-walk-or-glob 如果您有任何洞察力和時間,任何想法,讚賞。 – Relative0

+0

glob()不支持任意嵌套的子目錄(還)。這是唯一的區別。 'os.walk()'確實需要更多的過濾。請注意,'glob()'在它自己的實現中使用了*相同的過濾器方法*('fnmatch'模塊)。 –

相關問題