0

メタデータに基づいてメディア ファイル名を変更しようとしています。

ファイル名の形式はsong name - artist name

import os
from tinytag import TinyTag
import re

for root, dirs, files in os.walk("C:/Users/username/Desktop/Music/"):
    for name in files:
        tag = TinyTag.get(root + "\\" + name)
        if tag.artist != "":
            if name.endswith((".mp3",".m4a")):
                # try:
                file_ext = os.path.splitext(name)[-1]
                old_name = os.path.join(root, name)
                new_name = re.sub(' +', ' ', os.path.join(root, tag.title + " - " + tag.artist + file_ext))
                print(new_name)
                os.rename(old_name, new_name)
                # except:
                    # pass

Prince の Little Red Corvette を除いて、すべてのファイルが機能します。

C:/Users/username/Desktop/Music/1973 - James Blunt.mp3
C:/Users/username/Desktop/Music/Little Red Corvette  - Prince .mp3
Traceback (most recent call last):
  File "C:/Users/username/PycharmProjects/Practice/editAudioFileNames.py", line 15, in <module>
    os.rename(old_name, new_name)
ValueError: rename: embedded null character in dst

ValueError とはどういう意味ですか? コルベットの後に余分なスペースがあることに気付きました。re.subファイル名をトリミングするためにコードで使用しました。

try, exceptコードはそれで機能するため、今のところは無視してください。これは 850 曲のうちの 1 つだけなので、ファイル名を手動で変更できますが、今後の理解のために知りたいです。

ちなみに、これは私の初めての便利なコードです。最適化に関する批評は大歓迎です。

4

1 に答える 1

0

これらの行を置き換えてみてください

old_name = os.path.join(root, name)
new_name = re.sub(' +', ' ', os.path.join(root, tag.title + " - " + tag.artist + file_ext))

これらの行で

old_name = os.path.join(root, name.strip())
new_name = re.sub(' +', ' ', os.path.join(root, tag.title.strip() + " - " + tag.artist.strip() + file_ext.strip()))

ありがとう

于 2019-04-13T23:29:26.510 に答える