1

我正在尝试编写代码来组织 +40G 的音乐,我想按艺术家进行组织,到目前为止,我已经能够获取艺术家信息,但我正在为每个艺术家创建一个目录并拥有与同一个艺术家进入同一个目录,而不是为每首歌创建一个单独的目录。

import os #imports os functions
import eyed3 #imports eyed3 functions

root_folder = '/Users/ntoscano/desktop/mp3-organizer'

files = os.listdir(root_folder) #lists all files in specified directory
if not files[1].endswith('.mp3'):
    pass #if the file does not end with ".mp3" it does not load it into eyed3

for file_name in files:
    #if file_name.endswith('.mp3'): continue #if file ends with ".mp3" it continues onto the next line

    abs_location = '%s/%s' % (root_folder, file_name)

    song_info = eyed3.load(abs_location) #loads each file into eyed3 and assignes the return value to song_info
    if song_info is None:
        print 'Skippig %s' % abs_location
        continue
     os.mkdir(os.path.expanduser('~/Desktop/mp3-organizer/%s')) % song_info.tag.artist
     print song_info
     print song_info.tag.artist

这是我到目前为止所拥有的,但它坏了,第 19 行总是给我一个错误,

Nicolass-MacBook-Air:mp3-organizer ntoscano$ python eyeD3test.py 
Skippig /Users/ntoscano/desktop/mp3-organizer/.DS_Store
Traceback (most recent call last):
  File "eyeD3test.py", line 19, in <module>
    os.mkdir(os.path.expanduser('~/Desktop/mp3-organizer/%s')) % song_info.tag.artist
TypeError: unsupported operand type(s) for %: 'NoneType' and 'unicode'

我是编码新手,所以我确定这是一个简单的错误,但我只是不明白如何获得以艺术家信息为名称的目录。感谢任何帮助

4

1 回答 1

4

问题只是括号放错了地方。而不是这个:

os.mkdir(os.path.expanduser('~/Desktop/mp3-organizer/%s')) % song_info.tag.artist

做这个:

os.mkdir(os.path.expanduser('~/Desktop/mp3-organizer/%s' % song_info.tag.artist))

如果你把它分解成碎片,这更容易看出:

expanded = os.path.expanduser('~/Desktop/mp3-organizer/%s')
dir = os.mkdir(expanded)
formatted = dir % song_info.tag.artist

因此 ,您正在创建一个名为 的目录,并且/Users/ntoscano/Desktop/mp3-organizer/%s该目录正在返回None,然后您正在执行.None % song_info.tag.artistNoneTypeunicode%

在这种情况下,无论您是在 之前还是之后进行格式化都没有关系expanduser,但您必须在mkdir.

作为旁注,即使它是合法的,使用单个值而不是元组来%格式化('~/Desktop/mp3-organizer/%s' % (song_info.tag.artist,)')通常不是一个好主意。{}使用现代格式通常是一个更好的主意( '~/Desktop/mp3-organizer/{}'.format(song_info.tag.artist))。使用而不是字符串操作甚至更好os.path,因此这些问题甚至都没有出现。

另外,我注意到您root_folder在某些情况下使用手动扩展,但expanduser在其他情况下。您可能希望对此保持一致 - 否则,一旦您尝试在另一台~没有/Users/ntoscano. 而且,即使 OS X 允许您在某些情况下弄错路径名大小写,您也应该尽可能正确地处理它们。

把它们放在一起:

root_folder = os.path.expanduser('~/Desktop/mp3-organizer')

files = os.listdir(root_folder) #lists all files in specified directory

for file_name in files:
    #if file_name.endswith('.mp3'): continue #if file ends with ".mp3" it continues onto the next line

    abs_location = os.path.join(root_folder, file_name)

    song_info = eyed3.load(abs_location) #loads each file into eyed3 and assignes the return value to song_info
    if song_info is None:
        print 'Skippig %s' % abs_location
        continue
     os.mkdir(os.path.join(root_folder, song_info.tag.artist))
     print song_info
     print song_info.tag.artist
于 2013-01-03T00:54:27.233 回答