2012-08-03 40 views
0

我想讀取文件夾內的文件,原因是文件夾內的文件數量不固定,但如果有3個文本文件夾,則必須讀取所有3如果所有4個文本文件都是4個文件。從目錄中的文件讀取錯誤

這裏是我想要使用的代碼,而是用一個IOError出現:

for i in os.listdir("./RecordFolder"): 
    print i 

輸出是: record1.txt record2.txt

現在的問題是閱讀文件:

for files in os.listdir("./RecordFolder"): 
    filecontent = open(files).readlines() 
    for lines in filecontent: 
    print lines 

輸出:

IOError: [Errno 2] No such file or directory: 'record.txt' 

在這裏需要一些幫助,感謝

回答

10

功能os.listdir()只返回文件名,而不是完整路徑,所以你應該使用os.path.join()添加的目錄名稱:

directory = "./RecordFolder" 
for filename in os.listdir(directory): 
    with open(os.path.join(directory, filename)) as f: 
     for line in f: 
      print line 

(另請注意,你不應該爲簡單迭代使用file.readlines()這些問題已經在上面的代碼中修復了。)

+0

是..:D這就是爲什麼我喜歡stackoverflow,結識很多方法來實現山姆e事情:)謝謝@Sven Marnach – Whiskey 2012-08-03 13:46:35

+0

我還有一個小問題,如果records.txt是巨大的MB文件是使用循環的好主意?或者還有其他方法嗎? @mgilson – Whiskey 2012-08-03 13:57:08

+1

@Whiskey - 這取決於你想要什麼/需要脫離線條。如果你正在建立一個信息列表,也許你可以使用「列表理解」或「地圖」。但是,這實際上是一個好主意,很大程度上取決於實際處理的難度。例如:'[line.split()[0] for line in f]'不是太糟糕,但如果你實際上不想建立一個列表,那麼只需使用'for'循環。表現不會有很大的不同。 – mgilson 2012-08-03 14:03:58

2

os.listdir只返回文件夾中的文件的名稱。不是整個路徑。

你想要的東西,如:

directory = os.path.join(os.curdir, "RecordFolder") 
for files in os.listdir(directory): 
    filecontent = open(os.path.join(directory, files)).readlines() 
    for lines in filecontent: 
     print lines 

但這不應從一個文件中的行的最佳方式。看看蟒蛇上下文管理器 - 具體爲:

with open(filename) as f: 
    for line in f: 
     print line 

這將確保該文件是正確關閉(即使是在一個錯誤的事件 - 禁止在解釋本身或怪異的東西類似的分段錯誤)。

+0

謝謝,現在我知道我在哪裏出錯了。非常感謝:)它工作.. – Whiskey 2012-08-03 13:43:59