2013-03-04 71 views
6

我試圖編寫一個處理程序,對各個子目錄下的文件起作用,但是當我的腳本可以看到這些文件時,它無法對它們執行任何操作,因爲它無法執行組裝他們的路徑。正確使用os.path和os.join

的問題部分來源於此循環:

for (path, dirs, files) in os.walk("data/"): 
    for image in files: 
     #do something to the image 

現在,腳本工作在data目錄的第一級,但未能在data的子目錄工作。

我嘗試使用os.path.join()

for (path, dirs, files) in os.walk("data/"): 
    print os.path.join(path, dirs) 

但是,這將引發以下:

Traceback (most recent call last): 
    File "bench.py", line 26, in <module> 
    print os.path.join(path, dirs) 
    File "/usr/lib/python2.7/posixpath.py", line 75, in join 
    if b.startswith('/'): 
AttributeError: 'list' object has no attribute 'startswith' 

總之,我希望做的是裝配到包括圖像從data路徑data的子目錄。這樣做的最佳做法是什麼?

+2

當你得到這樣的異常時,通常是因爲你想要做一些像'dirs'這樣的值的列表,而不是每個值。 (如果你沒有意識到'dirs'是一個列表,那麼這個例外應該會引起這個可能性,並且你可以嘗試'print dirs'或'print type(dirs)'來查明。)你可以解決這個問題通過使用for循環,列表理解,map等等,就像mgilson的答案所表明的那樣,一旦你意識到這就是你想要做的。 – abarnert 2013-03-04 20:04:31

回答

7

我認爲,要在files

for path,dirs,files in os.walk('data/'): 
    for f in files: 
     fname = os.path.join(path,f) 
     assert(os.path.exists(fname)) 

dirsfile加入path每個file是目錄,其在目錄pathlist。您實際上可以修改dirs以防止os.walk進入某些目錄(整潔!)。

+0

@StevenRumbalski - 是的。這是正確的。感謝您的澄清。 (我編輯 - 希望避免任何混淆) – mgilson 2013-03-04 19:57:33

+0

+1。當然,如果您需要對子目錄執行某些操作(除了只看到它們的名稱或修剪列表),您還可以在'dirs'中爲每個'dir'加入''path''。 – abarnert 2013-03-04 20:01:11

1

嘗試:

for (path, dirs, files) in os.walk("data/"): 
    for image in files: 
    fname = os.path.join(path, image) 
    file = open(fname, 'rb') 

os.walk documentation兩個兩個例子只是做這件事情。

0
for (path, dirs, files) in os.walk("data/"): 
    for image in files: 
    file_path = os.path.join(path, image) 
    # do your stuff