#python
#python
Вопрос:
Я пытаюсь использовать fastkml для чтения / записи файлов KML, но, похоже, в lxml, который он использует для синтаксического анализа XML, есть что-то о UTF-8:
from fastkml import kml
from lxml import etree
INPUT_KML_FILE = "myfile.kml"
with open(INPUT_KML_FILE, 'rb') as myfile:
#AttributeError: 'bytes' object has no attribute 'encode'
#data=myfile.read().encode('utf-8')
data=myfile.read()
k = kml.KML()
#ValueError
k.from_string(data)
Какой обходной путь вы бы предложили?
Спасибо.
Редактировать: я попробовал с другим файлом KML, и все прошло нормально. Жаль, что FastKML / lxml не указывает, какая строка в файле KML ему не нравится.
INPUT_KML_FILE = "myotherfile.kml"
k = kml.KML()
with open(INPUT_KML_FILE,'rb') as kmlFile:
k.from_string(kmlFile.read())
print(k.to_string(prettyprint=True))
Ответ №1:
Попробуйте этот. Буква b обозначает двоичный файл и ее не нужно кодировать.
with io.open(name, 'r', encoding='utf-8') as file:
data = file.read()
Ответ №2:
(Оставляя дополнительные детали для аналогичных сомнений, связанных с fastkml-utf 8).
-
Когда вы читаете файл KML :
with os.open(name, 'r') as kmlFile: k = kml.KML() k.from_string(kmlFile.read().encode('utf-8'))
-
Когда вы читаете строку KML :
(Пусть doc будет строкой KML)
k.from_string(doc.encode(‘utf-8’))
Они гарантированно будут работать.
Кроме того, fastKML построен с использованием библиотеки lxml, поэтому вам не нужно использовать lxml.etree .
Если у вас есть дополнительные сомнения, связанные с Fastkml, вы можете ознакомиться со следующей статьей: https://medium.com/@wwaryan/the-definite-only-guide-to-fastkml-58b8e19b8454?source=friends_linkamp;sk=3537cbf9c2fd8d426feb95d4062c8516