我有一个像这样的文件夹系统:
我正在寻找所有mp3文件的列表(仅来自sub-dir),然后从该列表中播放随机mp3。
所以,我想出了以下代码:
import os
import random
import subprocess
# Set the root dir for mixtapes
rootDir = 'mixtapes'
# Function to make a list of mp3 files
def fileList(rootDir):
matches = []
for mixtape, subdir, mp3s in os.walk(rootDir):
for mp3 in mp3s:
if mp3.endswith(('.mp3', '.m4a')):
matches.append(os.path.join(mixtape, mp3))
return matches
# Select one of the mp3 files from the list at random
file = random.choice(fileList(rootDir))
print file
# Play the file
subprocess.call(["afplay", file])
但是,此代码以递归方式提取所有.mp3或.m4a文件...如果它们包含在“sub-dir”中,我只需要它们。
那么,我如何修改fileList函数,只有在子目录内才附加mp3?
答案 0 :(得分:0)
为什么不明显?检查一下:
类似的东西(没有检查确切的synatx)
for mixtape, subdir, mp3s in os.walk(rootDir):
for mp3 in mp3s:
if os.path.dirname(os.path.join(mixtape, mp3)) == rootDir:
continue
答案 1 :(得分:0)
一种可能的解决方案是对fileList()进行以下修改:
def fileList(rootDir):
matches = []
for d1 in next(os.walk(rootDir))[1]:
for d2 in next( os.walk(os.path.join(rootDir, d1)) )[1]:
for mixtape, subdir, mp3s in os.walk(os.path.join(rootDir, d1, d2)):
for mp3 in mp3s:
if mp3.endswith(('.mp3', '.m4a')):
matches.append(os.path.join(mixtape, mp3))
return matches
澄清一下,这个成语:
next(os.walk(some_dir))[1]
...返回some_dir中的子目录名称列表。
换句话说,上面的代码首先在搜索mp3之前将两个级别深入到文件夹heirarchy中。
另外,如果你在每个“sub-dir”文件夹中没有任何子文件夹,那么你可以在函数中的那一点使用os.listdir()而不是os.walk(),因为没有进一步的子文件夹遍历。