2012-08-03 26 views
58

我有一個文件夾,裏面有十個文件,我想循環。當我打印出來的文件的名字我的代碼工作正常:如何用Python循環文件?

import os 
indir = '/home/des/test' 
for root, dirs, filenames in os.walk(indir): 
    for f in filenames: 
     print(f) 

它打印:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

但是,如果我嘗試在循環中打開該文件,我得到IO錯誤:

import os 
indir = '/home/des/test' 
for root, dirs, filenames in os.walk(indir): 
    for f in filenames: 
     log = open(f, 'r') 

Traceback (most recent call last): 
File "/home/des/my_python_progs/loop_over_dir.py", line 6, in <module> 
log = open(f, 'r') 
IOError: [Errno 2] No such file or directory: '1' 
>>> 

我是否需要在循環內傳遞文件的完整路徑?

+0

你們是不是要遍歷目錄樹,或者你只是對特定目錄/文件夾中的常規文件感興趣? – Levon 2012-08-03 18:52:02

+0

我知道這個問題已經四歲了,但它仍然沒有被接受的答案。 – raoulcousins 2017-01-24 18:54:52

回答

24

是的,你需要完整的路徑。

log = open(os.path.join(root, f), 'r') 

是快速修復。正如評論指出的那樣,os.walk會變成子目錄,因此您需要使用當前目錄根目錄而不是indir作爲路徑連接的基礎。

+5

'os.walk'下降到子目錄,所以你不應該在這裏使用'indir'。使用'root'。 – 2012-08-03 18:34:48

+1

良好的捕獲,更新。 – koblas 2012-08-03 18:36:42

92

如果你只是尋找一個單一的目錄中的文件(即您是試圖遍歷目錄樹,它看起來並不像),爲什麼不直接使用os.listdir()

import os 
for fn in os.listdir('.'): 
    if os.path.isfile(fn): 
     print (fn) 

代替os.walk()。您可以指定一個目錄路徑作爲os.listdir()的參數。 os.path.isfile()將確定給定的文件名是否用於文件。

+0

OP的循環不僅僅打印一個目錄中的文件。它將文件(遞歸地)輸出到輸入目錄下的每個目錄中。 – mgilson 2012-08-03 18:35:20

+0

@mgilson我在查看OP的代碼(OP僅指文件名而不是目錄)時忽略了這一點,並且問題的一部分讀取了「我想循環訪問的包含10個文件的文件夾」。 ..我是否跳過一些信息? – Levon 2012-08-03 18:37:14

+0

如果OP具有目錄結構:'.'包含'file1','directory1'和'directory1'包含'file2'。 OP的代碼將打印'file1','file2',而你的解決方案將打印'file1','directory1'。 (對不起,這真的很難在評論中解釋)。 – mgilson 2012-08-03 18:40:14

4

the documentation至os.walk的例子說明如何做到這一點:

for root, dirs, filenames in os.walk(indir): 
    for f in filenames: 
     log = open(os.path.join(root, f),'r') 

你是怎麼想到了「開放」的功能,要知道,字符串「1」的解釋是:「/家/ des/test/1「(除非」/ home/des/test「碰巧是你當前的工作目錄)?

4

下面是會走的文件樹爲你一個片段:

indir = '/home/des/test' 
for root, dirs, filenames in os.walk(indir): 
    for f in filenames: 
     print(f) 
     log = open(indir + f, 'r') 
7

你必須指定您正在使用的路徑:

source = '/home/test/py_test/' 
for root, dirs, filenames in os.walk(source): 
    for f in filenames: 
     print f 
     fullpath = os.path.join(source, f) 
     log = open(fullpath, 'r')