Проблема с поиском файлов из-за иностранных символов

Пишу сюда впервые, надеюсь, у меня все хорошо. Я использую python 3.5 на Win10 и пытаюсь «синхронизировать» музыку из Itunes с моим устройством Android. По сути, я читаю XML-файл библиотеки Itunes и получаю расположение всех файлов (чтобы я мог копировать / вставлять их в свой телефон), но у меня проблемы с песнями, содержащими иностранные символы.

import getpass
import re
import os
from urllib.parse import unquote

user = getpass.getuser()
ITUNES_LIB_PATH = "C:\\Users\\%s\\Music\\Itunes\\iTunes Music Library.xml" % user
ITUNES_SONGS_FILE = "ya.txt"


def write(file, what, newline=True):
    with open(file, 'a', encoding="utf8") as f:
        if  not os.path.isfile(what):
            print("Issue locating file %s\n" % what)
        if newline:
            what+"\n"
        f.write(what)


def get_songs(file=ITUNES_LIB_PATH):
    with open(file, 'r', encoding="utf8") as f:
        f = f.read()
        songs_location = re.findall("<key>Location</key><string>file://localhost/(.*?)</string>", f)
        for song in songs_location:
            song = unquote(song.replace("/", '\\'))
            write(ITUNES_SONGS_FILE, song)


get_songs()

Выход:

Issue locating file C:\Users\Dymy\Desktop\Media\Norin &#38;amp; Rad - Bird Is The Word.mp3

Как мне справиться с этим «&» в имени файла?


person mrclx    schedule 10.11.2015    source источник
comment
Возможно, вы могли бы снова использовать replace(), чтобы превратить все &amp; в &.   -  person Will    schedule 10.11.2015
comment
или используйте html-библиотеку, как ответ здесь   -  person R Nar    schedule 10.11.2015
comment
спасибо @RNar, это решило проблему! Мне было интересно, есть ли способ избежать кодировки utf8, избегая чтения() и записи()...   -  person mrclx    schedule 10.11.2015
comment
&#38;amp; - это амперсанд, экранированный дважды. Это не имеет ничего общего с какой-либо кодировкой символов.   -  person roeland    schedule 11.11.2015
comment
Мне пришлось преодолеть UnicodeError, установив utf8 в качестве кодировки, которая изменяет строки и приводит к неправильным путям к файлам, мне было интересно, можно ли вообще работать с этими путями без кодирования в utf8. @роланд   -  person mrclx    schedule 11.11.2015
comment
Это не имеет смысла. «установка кодировки на utf-8» не «меняет строки». В любом случае действительный файл XML указывает правильную кодировку в первой строке файла, например. <?xml version="1.0" encoding="utf-8"?>.   -  person roeland    schedule 11.11.2015
comment
Используйте синтаксический анализатор XML для чтения файла. Он будет обрабатывать экранирование XML и правильно декодировать файл. Вам все равно нужно объявить кодировку для записи файла.   -  person Mark Tolonen    schedule 11.11.2015
comment
Если вы предоставите небольшой образец XML, который вы анализируете, я уверен, что вы сможете получить лучшие ответы.   -  person Mark Tolonen    schedule 11.11.2015
comment
Хорошо, извините за задержку, ребята.. Я был занят. В любом случае, я проверил файл XML, и кодировка utf8, я не знал, что в файлах XML некоторые символы переписываются по-разному, такие как &, кавычки и так далее. Я все еще новичок в программировании ... Так что в основном все, что мне нужно было сделать, это отменить экранирование строк, чтобы получить расположение файлов.   -  person mrclx    schedule 12.11.2015
comment
несвязанный: чтобы избежать экранирования обратной косой черты, вы можете использовать литералы необработанных строк для путей Windows, например, r'C:\Users\Dymy\...'   -  person jfs    schedule 14.11.2015


Ответы (1)


В вашем коде есть несколько связанных проблем, например, неэкранированные ссылки на символы xml, жестко закодированные кодировки символов, вызванные использованием регулярных выражений для анализа xml. Чтобы исправить их, используйте xml синтаксический анализатор, например xml.etree.ElementTree. или используйте более конкретную библиотеку pyitunes (я не пробовал).

person jfs    schedule 13.11.2015