Аргумент toprettyxml (): write () должен быть str, а не байтами - PullRequest
0 голосов
/ 06 мая 2018

Моя программа сохраняет немного данных XML в файл в симпатичном формате из строки XML. Это делает трюк:

from xml.dom.minidom import parseString
dom = parseString(strXML)
with open(file_name + ".xml", "w", encoding="utf8") as outfile:
    outfile.write(dom.toprettyxml())

Однако я заметил, что в моем заголовке XML отсутствует параметр кодировки.

<?xml version="1.0" ?>

Поскольку мои данные могут содержать много символов Юникода, я должен убедиться, что в поле кодировки XML также указан UTF-8.

Теперь, просматривая документацию minidom, я прочитал, что «для указания поля кодирования заголовка XML можно использовать дополнительное кодирование аргумента ключевого слова». Итак, я пытаюсь это:

from xml.dom.minidom import parseString
dom = parseString(strXML)
with open(file_name + ".xml", "w", encoding="utf8") as outfile:
    outfile.write(dom.toprettyxml(encoding="UTF-8"))

Но тогда я получаю:

TypeError: write() argument must be str, not bytes

Почему первый фрагмент кода не приводит к этой ошибке? И что я делаю не так?

Спасибо!

R.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Вы можете решить проблему следующим образом:

with open(targetName, 'wb') as f:
    f.write(dom.toprettyxml(indent='\t', encoding='utf-8'))
0 голосов
/ 06 мая 2018

из документации ударная мина:

Без аргумента в заголовке XML не указывается кодировка, и в результате получается Строка Unicode , если кодировка по умолчанию не может представлять все символы в документе. Кодирование этой строки в кодировке, отличной от UTF-8, вероятно, некорректно, поскольку UTF-8 является кодировкой XML по умолчанию.

При явном аргументе кодирования в результате получается строка байтов в указанной кодировке. Рекомендуется всегда указывать этот аргумент. Чтобы избежать исключений UnicodeError в случае непредставляемых текстовых данных, аргумент кодирования должен быть указан как «utf-8».

Таким образом, метод write выводит другой тип объекта независимо от того, установлена ​​кодировка или нет (что довольно сложно, если вы спросите меня)

Таким образом, вы можете исправить, удалив кодировку:

with open(file_name + ".xml", "w", encoding="utf8") as outfile:
    outfile.write(dom.toprettyxml())

или откройте ваш файл в двоичном режиме , который затем принимает байтовые строки для записи в

with open(file_name + ".xml", "wb") as outfile:
    outfile.write(dom.toprettyxml(encoding="utf8"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...