2013-02-19 72 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是默认值。