从os.walk创建字典推导式

4 投票
3 回答
1891 浏览
提问于 2025-04-17 16:25

我想创建一个字典,里面存放所有的mp3文件。字典的键是mp3文件的名字,值是这个文件的路径。

我这样做:

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文件。

有什么想法吗?

3 个回答

0

你在给字符串编号的时候稍微搞错了:

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

除了之前提到的[-4]问题,你在for循环里一直在覆盖source_files_now这个变量。你应该在循环之前先初始化它,然后在循环中往里面添加内容,而不是用字典推导式。

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)

这并不会导致你的脚本出错,但应该是topdown=True,而不是topdown='true'。我把它去掉了,因为True是默认值。

7

filename[-4] == '.mp3' 这个表达式是在检查文件名倒数第三个字符是否是 '.mp3'。这样做其实不太合理。

不如直接使用 .endswith() 方法来判断文件名是否以特定的后缀结尾:

filename.endswith('.mp3')

如果你想修正你的代码,可以对字符串进行切片,这样切片就能包含其他字符:

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

我还建议在比较之前把文件名转换成小写字母,这样可以避免漏掉那些全是大写字母的文件名。

撰写回答