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.artistので、についてのエラーが発生し NoneTypeunicodeがサポートされなくなり%ます。

この場合、の前または後にフォーマットを行うかどうかは関係ありませんが、の前expanduserに行う必要がありますmkdir

%ちなみに、それは合法ですが、 -formatting( )にタプルの代わりに単一の値を使用することは一般的に悪い考え'~/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 に答える