Текст скрипта такой.
import re
import shutil
import os
from mp3_tagger import VERSION_1, VERSION_2, MP3File
def func_list_files():
"""
Возвращает список файлов внутри папки, исключая файлы программы
:return: None
"""
return [f for f in os.listdir('.') if os.path.isfile('.' + '\\' + f)
and not f.endswith('.py') and not f.endswith('.exe')]
def func_list_dirs():
"""
Возвращает список папок внутри исходной
:return: None
"""
return [f for f in os.listdir('.') if os.path.isdir('.' + '\\' + f)]
def func_bad_name(name):
exceptions = {'\\', '/', '|', '<', '>', '?', ':', '"', '*', '.'}
return bool(set(name).intersection(exceptions))
def func_get_tags(var_file, var_version):
"""
Получает файл и возврящает список [артист, альбом]
:param var_file: Файл для обратотки
:param var_version: Версия тегов для работы
:return: список тегов
"""
mp3 = MP3File(os.path.join('.', var_file))
mp3.set_version(var_version)
return [mp3.artist, mp3.album, mp3.year]
def func_main():
"""
Читает теги mp3 файлов, создает папки с названиями исполнителя и альбома
и перемещает файлы в соответствии с их тегами
:return: None
"""
for file in func_list_files():
print(file)
tags = func_get_tags(file, VERSION_2)
if None in tags:
tags = func_get_tags(file, VERSION_1)
if None in tags:
continue
name = tags[0] + '-' + tags[2] + '-' + tags[1]
exception_chars = '\\\/\|<>\?:"\*\.'
find_exceptions = re.compile('([{}])'.format(exception_chars))
name = re.sub('\s+', ' ', name)
if func_bad_name(name):
name = re.sub(find_exceptions, '', name)
name = re.sub('\s+$', '', name)
try:
print(name)
os.mkdir(name)
except FileExistsError:
pass
shutil.move(file, '.\\{}\\'.format(name))
input('press enter to exit')
def func_main_reversed():
"""
Функция обратная main
:return: None
"""
path = os.getcwd()
for folder in func_list_dirs():
print(folder)
os.chdir('.\\{}'.format(folder))
for file in func_list_files():
print(file)
shutil.move(file, path)
os.chdir('..')
os.rmdir(folder)
input('press enter to exit')
# func_main_reversed()
func_main()
py.user.next
Значит, из тегов попал нуль-символ в строку
Проверка на запретные осуществляется. Если только я упустил какой-то, но вроде нет. И скрипт спотыкается на вполне простых именах (буквы, тире плюс цифры и ничего более).
JOHN_16
что бы не задавать такой вопрос на форуме нужно научиться отлаживать вашу программу. Оборачиваете ваш вызов mkdir в try except и когда произойдет ошибка делаете хоть принт хоть запись в файл с отладочной информацией, которая бы помогла вам разобраться в проблеме.
Не совсем понял этот момент. Ну обернуть в try except понятно, а какую отладочную информацию вывести? Текст ошибки? - он и так выведется.
Строка на которой была ошибка? - она выводится и в ней все хорошо (ну по крайней мере на глаз). Что еще и как это вывести?
Можно подробнее про целостность данных и почему она нарушается при считывании тега в строку. И почему если строка print'ом выводится корректно если она “не целостна и адекватна”. если можно ссылку на инфу где можно об этом почитать.
ps: убрать что-либо внутрь спойлера на форуме можно? Какой тег?