从os.walk创建字典推导式
我想创建一个字典,里面存放所有的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'
我还建议在比较之前把文件名转换成小写字母,这样可以避免漏掉那些全是大写字母的文件名。