python无法在内存中反序列化avro

2024-06-16 10:31:02 发布

您现在位置:Python中文网/ 问答频道 /正文

目前,我正在使用请求从数据库中获取avro文件并将数据存储在请求.text. 文件由模式和数据分隔。如何将内存中的模式和数据合并到可读/可用的数据中。你知道吗

你知道吗请求.text以Unicode格式将数据向下转换,并首先按模式将其分离,然后按数据将其分离。我已经能够使用字符串操作来获取Unicode的模式部分并将其设置为模式变量,但是我不确定如何处理数据部分。我试着将数据编码到utf-8,并在代码中以原始字节的形式传递,但没有成功

#the request text is too large, so I am shortening it down
r.text = u'Obj\x01\x04\x14avro.codec\x08null\x16avro.schema\u02c6\xfa\x05{"namespace": "namespace", "type": "record", "fields" : [{"type": ["float", "null"], "default": " ", "name": "pvib_z_crest_factor"}], 

#repeat for x amount of fields

"name": "Telemetry"}\x00\u201d \xe0B\x1a\u2030=\xc0\u01782\n.\u015e\x049\xaa\x12\xf6\u2030\x02\x00\u0131\u201a];\x02\x02\x02\x00\xed\r>;\x02\x02\x00\x01\x02\x00\x00\x02\x00\x00\x00\x00\x00\x02\x02\x00\x00\x00\x1aC\x00\x00\x00\x02C\x02\x00:\x00@2019-02-27 16:38:39.530263-05:00\x02\x02\x00\xaeGa=\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\x04\x02\x00\x00\x00\x00\x00\x00\x00\x02\x02\x02\x02\x00\xac\xc5\'7\x00\x00\x00\xe9B\x02\x00\x00\x00\x00\x00\x00\x0e-r@\x00\x00\x00\x00\x00\x02\x02\x00\xfa\xc0\xf5A\x00\x00\x00\xc0@\x00\x00\x00\x00\x02\x00\x02\xc9\xebB\x00\x00\x00\x00\x00\x00\xaa\ufffd\'\x02\x00\x02\xc9\xebB\x02\x02\x00\x00\x00\x00\x00\x02\x00\ufffd\xc2u=\x02\x00\xfc\x18\xd3>\x02\x02\x00\\\ufffdB>\x02\x02\x001\x08,=\x02\x00\x00\x02\x02\x00\x000oE\x00sh!A\x02\x00\x00\xc0uE\x02\x00\xf6(tA\x00\x00\x00\x00\x00\x00-\xb2\ufffd=\x02\x00\x1c \xd1B\x02\x02\x00@2019-02-27 16:38:39.529977-05:00\x02\x00\x080894\x00\u011f\xa7\xc6=\x00\x00\x02\x02\x02\x02\x02\x02\x00\x00\x00\xe0A\x02\x00\x00\x00\u011eA\x00\x00\x00\xb8A\x00\xc3\xf5\xc0@\x00\xd5x\xe9=\x02\x00\x00\x00q=VA\x02\x00\x00\x000B\x02\x00ZV\xfaE\x02\x02\x02\x02\x00\x00\x00!C\x02\x00\x00\x00#C\x00\x00\x00)C\x00\x00\x02\x00\x00\x00\u20ac?\x00\x00\x02\x02\x02\x02\x02\x00\xf8\x04\x02\x00\x00\x00\x00\x00\x02\x00\x00\x00\u20ac?\x00\x02W\x00ff6A\x00\x00\x00\x00\x00\x02\x00\xcc&\x10L\x00\x00\xf7\x7fG\x02\x02\x02\x00\x00\x00\x00\x00\x02\x02\x02\x00\x00\u20ac\xacC\x02\x02\x02\x00\x1c~%A\x00\x1c \xd1B\x00\x01\x02\x02\x02\x00\xfa\xc0\xf5A\x02\x02\x02\x02\x02\x00\x00\x000B\x00\x00\x00\x00\x00\x00\x00\x00?C\x00\xf4-\x1fE\x00\x00\x00\x00\x00\x00\x00\u0131\x7fG\x00\x00\u015f\x7fG\x00\x00\u0131\x7fG\x00\x00\x00\x0bC\x00@2019-05-31 13:00:25.931949+00:00\x00@2019-05-31 09:00:25.931967-04:00\x00\x00\x00\xe0A\x00h\xe8\u0178:\x00=\n%C\x00\x00\x00\x07C\x02\x00\x00\x00\xe0@\x00\x01\x02\x00\x00\x02\x02\x00\x00\u011e\u2020F\x02\x00\x00\u20acDE\x00\xcd\xcc\xcc=\x00@2019-02-27 16:38:39.529620-05:00\x02\x00\x00\x00\xc8B\x00\x00\x00\x06C\x02\x00\x01\x004\u20ac7:\x00\x00\x000B\x02\x02\x02\x02\x02\x02\x0033CA\x02\x00L7\t>\x02\x02\x00\xae\xc7\xa7B\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x02\x02\x00\x00\x00pB\x00\x00\x00`B\x00\x00\x02\x00\x00\x00...
#continues on, too big to put the rest of (feel free to ask questions to see more)

除了内存中要反序列化为可读数据的文件外,我还经常遇到列表超出范围或无法访问分支索引x的错误

谢谢你的阅读

编辑(6/5/19):

我设法在另一台设备上使用azure存储资源管理器下载了avro文件。从这里,我运行了以下代码:



import avro.schema
from avro.io import DatumReader, DatumWriter
from avro.datafile import DataFileReader, DataFileWriter


avro_file = DataFileReader(open("Destination/to/file.avro", "rb"), DatumReader())
avro_file = [x for x in avro_file]
for i in range(len(avro_file)):
    print(len(data))
    print(data[i])

(注意:我运行此代码的计算机运行的是python3.7版本,但这两个python版本之间没有真正的语法变化)

此代码运行平稳,并在适当的位置显示数据。 但是,不能简单地将从请求接收到的相同数据作为参数传递给DataFileReader(说明了显而易见的情况,但是猜测这与在打开文件和文件时调用“rb”有关)请求.text使用unicode)。他们有什么办法来修改吗请求.text这样我就可以在DataFileReader中作为参数传递它(替换open(file,“rb”))?你知道吗


Tags: 文件to数据代码text模式avrofile
1条回答
网友
1楼 · 发布于 2024-06-16 10:31:02

你想要的是content,而不是text

我还认为您应该尝试BytesIO,它应该可以像文件对象一样使用

import io
import requests

r = requests.get("http://example.com/file.avro")
inmemoryfile = io.BytesIO(r.content)

reader = DataFileReader(inmemoryfile, DatumReader())
records = list(reader)
reader.close()

(代码未测试)

相关问题 更多 >