2013-02-19 74 views
3

我想創建一個所有mp3文件的字典,其中的關鍵是mp3文件名,值是該文件的文件路徑。從os.walk創建詞典理解

我做的:

for root, dirs, files in os.walk(rootDir, topdown='true'): 
    source_files_now = {filename:root for filename in files if filename[-4] == '.mp3'} 
    print(source_files_now); 

但字典,source_files_now結束是空的。

目錄中有定義的mp3文件。

任何想法?

回答

7

filename[-4] == '.mp3'檢查倒數第三個字符是否爲'.mp3'。這沒有什麼意義。

只需使用.endswith()

filename.endswith('.mp3') 

如果你想修復你的代碼,切片繩子,讓片包括其他人物:

filename[-4:] == '.mp3' 

我還的文件名轉換爲在比較之前使用小寫字母。您最終可能會跳過全部大寫的文件名。

+1

此外,'dict.fromkeys'可能比字典理解更好... – mgilson 2013-02-19 21:42:46

+0

@mgilson你能給我一個代碼片段或給我一個鏈接,並告訴我爲什麼fromKeys更好? – dublintech 2013-02-19 21:43:27

+1

或使用'os.path.splitext(filename)[1] .lower()=='mp3'' – isedev 2013-02-19 21:43:37

0

您指數字符串稍有不當:

>>> s = 'buddyholly.mp3' 
>>> s[-4] 
'.' 
>>> s[-4:] 
'.mp3' 
2

除了已經提到的[-4,4]的問題,你在你的for循環覆蓋source_files_now。在循環上方初始化它,並添加到它而不是使用dict理解。

source_files_now = {} 
for root, dirs, files in os.walk(rootDir): 
    for filename in files: 
     if filename.endswith('.mp3'): 
      source_files_now[filename] = os.path.join(root, filename) 

它不會破壞你的劇本,但它應該是自上而下=真,不自上而下=「真」。我刪除它,因爲True是默認值。