2017-09-24 99 views
0

我试图访问文件夹中所有mp3歌曲的元数据。我正在使用Ubuntu 16.04 Virtualbox和eyed3 0.6.18-1以及windows和ubuntu之间的共享文件夹。我试过以下内容:试图从使用循环的文件夹访问mp3歌曲的id3标签

import os 
import eyeD3 

for root, dir, files in os.walk("home/undead/ShareWindowsTest")": 
    for file in files: 
     if file.endswith(".mp3"): 
      audiofile = eyeD3.Mp3AudioFile(file) 
      print audiofile.tag.getTitle() 

这是假设打印文件夹中每首歌的标题。但是这不起作用。我试过用

if eyed3.isMp3File(file): 

但是还是没有运气。该错误是特别在audiofile = ...行,其中“文件”似乎是一个字符串,而不是一个MP3文件,因此不是一个适当的输入参数。我真的很陌生,并希望得到一些帮助。现在

+0

你告诉我们你认为错误的含义是什么,但是你说你不了解它。您还应该复制完整的错误消息。 – rodrigo

+0

/usr/bin/python2.7 /home/undead/PycharmProjects/KavTest/Test1.py 回溯(最近呼叫最后): 文件“/home/undead/PycharmProjects/KavTest/Test1.py”,第25行在 的AudioFile = eyeD3.Mp3AudioFile(文件) 文件 “/usr/lib/python2.7/dist-packages/eyeD3/tag.py”,线1653,在__init__ F =文件(self.fileName ,“rb”); IOError:[Errno 2]没有这样的文件或目录:'01 California Dreaming(copy).mp3' – Undead

回答

0

您键入完整的错误消息的错误是明显的:

No such file or directory: '01 California Dreaming (copy).mp3' 

这意味着,呼叫是正确的,但您正在使用的文件名不存在。你在想:“但它来自os.walk(),所以它必须存在!”。嗯,是的,但os.walk()返回元组列表,每个元组的列表:root, dirs, filesfiles名称列表是root目录中的文件名。

解决方法:你来串联rootfile的名字:您的os.walk("/home...)是否缺少龙头/

for root, dir, files in os.walk("home/undead/ShareWindowsTest")": 
    for file in files: 
     path = os.path.join(root, file) 
     audiofile = eyeD3.Mp3AudioFile(path) 

PS?

+0

这纠正了错误。通过添加路径...行来说,它将“文件”链接到它指向的实际文件是否正确?也非常感谢你:) – Undead

+0

不客气!但我不这么认为,_linking_在讨论文件时具有不同的具体含义(详见_hard link_或_symbolic link_)。在你的程序'root'中,'file'和'path'是包含所需文件名称(或部分名称)的文本字符串。你可以说'路径'指向实际的文件,或者它包含文件的名称,甚至指向文件。 – rodrigo

+0

当然,'file'也包含文件的名称,但它不起作用,因为这个名字是相对于'root'的,并且当你使用相对名字作为文件名时,它总是被解释为相对于_current工作目录_(CWD)。所以除非你的CWD等于'root',否则它不起作用。根据你传递给'os.walk()'的内容,通过加入'root'和'file',你可以使'path'成为绝对名称或者是相对于实际CWD的名称。 – rodrigo