Есть ли способ для клиента облачного хранилища Google указать на «файловый объект» в облачном хранилище, который затем будет использоваться lxml? - PullRequest
0 голосов
/ 17 января 2019

С клиентом Google Cloud Storage я не смог прочитать файл Storage как объект, как того требует lxml.etree.parse. Я мог прочитать файл облачного хранилища как большой двоичный объект, но он плохо работал с lxml.

Я пытаюсь конвертировать XML-файлы, используя XSLT-файл. Я хочу использовать облачную функцию Google (в Python3.7), которая будет активирована, как только файл XML будет загружен в облачное хранилище. Я пробовал этот код, храня файлы локально, и он работает. Однако нужен способ заставить это работать и с облачным хранилищем.

----Using local files (Working Code):
import lxml.etree as ET
filename = "C:\\GCP\\Files\\Profile.xml"
xsltfile = "C:\\GCP\\Files\\Transform.xslt"
outpath = "C:\\GCP\\Files\\Output\\Output.json"

dom = ET.parse(filename)
xslt = ET.parse(xsltfile)
transform = ET.XSLT(xslt)
newdom = transform(dom)
xdom = str(newdom)

text_file = open(outpath, "w")
text_file.write(xdom)
text_file.close()

----Using Cloud storage(not working):
from google.cloud import storage
import lxml.etree as ET

client = storage.Client()
bucket = client.get_bucket('customerfile02')
xmlblob = bucket.blob('testprofile.xml')
inputxml=xmlblob.download_as_string()
xmldom = ET.parse(inputxml)

Error: failed to load external entity  

Ошибка ожидается, так как я передаю XML-строку вместо File Object, как ожидается ET.parse Как я могу передать файловый объект из облачного хранилища, чтобы заставить это работать?

1 Ответ

0 голосов
/ 17 января 2019

Функция lxml.etree.parse() ожидает строку в качестве имени файла. Если вы хотите вместо этого передать содержимое файла, вам нужно обернуть его в StringIO или BytesIO (в данном случае, последнее):

from io import BytesIO
from google.cloud import storage
import lxml.etree as ET

client = storage.Client()
bucket = client.get_bucket('customerfile02')
xmlblob = bucket.blob('testprofile.xml')
inputxml = xmlblob.download_as_string()
xmldom = ET.parse(BytesIO(inputxml))

См. Документацию lxml здесь: https://lxml.de/parsing.html.

...