Python 如何将格式错误的字节转换为字典?
我有一个卡夫卡消费者读取字节,我需要将其视为字典。 这是制作人发布的方式:Python 如何将格式错误的字节转换为字典?,python,python-3.x,Python,Python 3.x,我有一个卡夫卡消费者读取字节,我需要将其视为字典。 这是制作人发布的方式: def on_status(self, status): print "on_status" if status.retweeted: return tweetText = status.text.encode('utf8') created_at = status.created_at id = status.id if (re.findall(self.ht
def on_status(self, status):
print "on_status"
if status.retweeted:
return
tweetText = status.text.encode('utf8')
created_at = status.created_at
id = status.id
if (re.findall(self.httpCheck, tweetText) or re.findall(self.httpsCheck, tweetText)):
return
if (re.search('[a-zA-Z]', tweetText)):
try:
self.idSelf += 1
self.tweet["tweet"] = tweetText
self.tweet["id"] = id
self.tweet["sequence"] = self.idSelf
self.tweet["created_at"] = created_at
future = producer.send('bubble-test', bytes(self.tweet))
except Exception as e:
print e
finally:
producer.flush()
这是使用者处理字节数据的方式:
consumer = KafkaConsumer('bubble-test', bootstrap_servers='localhost:9092', auto_offset_reset='earliest')
for message in consumer:
tweet = ast.literal_eval(message.value)
print (type(tweet))
sys.exit()
使用ast.literal_eval()时,出现以下错误:
ValueError:节点或字符串格式不正确:b'{'created\u at\':
datetime.datetime(2018,5,25,13,35,11),“推特”:“RT@KKRiders:
马维将在预选赛中打出第一个球2.萨哈进球。让我们
go!\n\n#SRHvKKR#teesravar#kkrhaitaiyar“,“id”:
100000737131764736,\'sequence\':1}'
如何将其视为字典,这是我的最终结果?
ast.literal\u eval
不支持datetime
对象。对于像这样的幼稚对象,您可以发送其属性的元组,并在另一侧使用datetime.datetime(*attrs)
重新构造它。如果酸洗是一种选择,你可以试试;它已经支持这样的对象。ast.literal\u eval
此消息有三个问题
- 它需要文本而不是字节-使用
decode('utf-8')
- 它需要
而不是\\n
-使用\n
替换(“\n”,“\\n”)
- 它无法计算
对象,因为它只能计算字符串、数字、元组、列表、dicts、boolean和None。(文件:) 但是,您可以删除字符串datetime
,然后得到 可以评估。计算后,您可以将元组转换为datetime 回来datetime.datetime
consumer = KafkaConsumer('bubble-test', bootstrap_servers='localhost:9092', auto_offset_reset='earliest')
for message in consumer:
tweet = (message.value)
tweet.replace('\n', '\\n')
tweet = eval(tweet)
我只有错误消息中的
字节
——可能是消息。值
是不同的对象,它不作为字节
工作。
consumer = KafkaConsumer('bubble-test', bootstrap_servers='localhost:9092', auto_offset_reset='earliest')
for message in consumer:
tweet = (message.value)
tweet.replace('\n', '\\n')
tweet = eval(tweet)