Fastkml и UTF-8?

#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