ValueError: rename: встроенный нулевой символ в dst - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь переименовать имена файлов мультимедиа на основе метаданных.

Формат имени файла 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:

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 Ответ

0 голосов
/ 14 апреля 2019

Можете ли вы попробовать заменить эти строки

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()))

Спасибо

...