2015-04-18 84 views
3

我是比較新的蟒蛇,我想我的手在週末的項目。我想通過我的音樂目錄瀏覽,並得到每個音樂文件的藝術家姓名和導出爲CSV,這樣我可以升級我的音樂收藏(很多是從年輕的時候,並沒有關心質量) 。唔明目錄導航與os.walk

無論如何,我試圖讓在其各自的目錄中的每個音樂文件的路徑,這樣我就可以把它傳遞給ID3標籤讀取模塊獲得藝術家的名字。

這裏是我嘗試:

import os 

def main(): 
    for subdir, dirs, files in os.walk(dir): 
     for file in files: 
      if file.endswith(".mp3") or file.endswith(".m4a"): 
       print(os.path.abspath(file)) 

然而,.abspath()不會做什麼,我認爲它應該。如果我有一個目錄是這樣的:

music 
--1.mp3 
--2.mp3 
--folder 
----a.mp3 
----b.mp3 
----c.mp3 
----d.m4a 
----e.m4a 

,我跑我的代碼,我得到這樣的輸出:

C:\Users\User\Documents\python_music\1.mp3 
C:\Users\User\Documents\python_music\2.mp3 
C:\Users\User\Documents\python_music\a.mp3 
C:\Users\User\Documents\python_music\b.mp3 
C:\Users\User\Documents\python_music\c.mp3 
C:\Users\User\Documents\python_music\d.m4a 
C:\Users\User\Documents\python_music\e.m4a 

我很困惑,爲什麼它不顯示5個文件是一個內部夾。 除此之外,我是否會以最簡單或最好的方式解決這個問題?再次,我是新來的python,所以任何幫助表示讚賞。

+0

您應該添加一些打印件,它會使它很明顯發生了什麼。 –

回答

4

你通過只是文件名到os.path.abspath(),它沒有上下文,但你當前的工作目錄。

加入與subdir參數的路徑:

print(os.path.join(subdir, file)) 

os.path.abspath() documentation

在大多數平臺上,這相當於調用函數normpath()如下:normpath(join(os.getcwd(), path))

因此,如果您當前的工作目錄是C:\Users\User\Documents\python_music所有的文件都相對於該文件進行了連接。

os.walk給你正確的位置以基礎文件名,而不是關閉;從the documentation

對於樹中的每個目錄在目錄頂部根(包括頂部本身),它產生一個3元組(dirpath, dirnames, filenames)

dirpath是一個字符串,該目錄路徑。 [...]文件名dirpath中的非目錄文件的名稱列表。 請注意,列表中的名稱不包含路徑組件。要獲得dirpath完整路徑(與頂部開始)到一個文件或目錄,請os.path.join(dirpath, name)

強調我的。