我对python相对较新,而且我在周末项目中尝试了一下。我想浏览我的音乐目录并获取每个音乐文件的艺术家名称并将其导出到csv以便我可以升级我的音乐收藏(很多是从我年轻时开始并且不关心质量)。
无论如何,我试图在每个目录中获取每个音乐文件的路径,因此我可以将其传递给id3标签阅读模块以获取艺术家名称。
以下是我的尝试:
import os
def main():
for subdir, dirs, files in os.walk(dir):
for file in files:
if file.endswith(".mp3") or file.endswith(".m4a"):
print(os.path.abspath(file))
然而,.abspath()并没有做我认为应该做的事情。如果我有这样的目录:
music
--1.mp3
--2.mp3
--folder
----a.mp3
----b.mp3
----c.mp3
----d.m4a
----e.m4a
我运行我的代码,得到这个输出:
C:\Users\User\Documents\python_music\1.mp3
C:\Users\User\Documents\python_music\2.mp3
C:\Users\User\Documents\python_music\a.mp3
C:\Users\User\Documents\python_music\b.mp3
C:\Users\User\Documents\python_music\c.mp3
C:\Users\User\Documents\python_music\d.m4a
C:\Users\User\Documents\python_music\e.m4a
我很困惑为什么它没有显示文件夹中的5个文件。 除此之外,我是否以最简单或最好的方式解决这个问题?再一次,我是python的新手,所以感谢任何帮助。
答案 0 :(得分:4)
您正在将 文件名传递给os.path.abspath()
,该文件没有上下文,但是您当前的工作目录。
使用subdir
参数加入路径:
print(os.path.join(subdir, file))
来自os.path.abspath()
documentation:
在大多数平台上,这相当于调用函数
normpath()
,如下所示:normpath(join(os.getcwd(), path))
。
因此,如果您当前的工作目录为C:\Users\User\Documents\python_music
,则所有文件都将相对于此加入。
但os.walk
为您提供了正确的文件名基础位置;来自the documentation:
对于以 top 目录(包括 top 本身)为目标的树中的每个目录,它会产生一个3元组
(dirpath, dirnames, filenames)
。dirpath 是一个字符串,即目录的路径。 [...] 文件名是 dirpath 中非目录文件名称的列表。 请注意,列表中的名称不包含路径组件。要获取完整路径(以 top 开头)到 dirpath 中的文件或目录,请执行
os.path.join(dirpath, name)
。
强调我的。