我有一个读取字节的Kafka使用者,我需要将其视为字典。 这就是制片人发布的方式:
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_at \': datetime.datetime(2018,5,25,13,35,11),\'tweet \':“RT @KKRiders: Mavi将#Qualifier2的第一球打成碗。萨哈罢工。让我们 go!\ n \ n#SRHvKKR #TeesraVaar #KKRHaiTaiyaar“,\'id \': 1000007371131764736,\'sequence \':1}'
如何将其视为字典,这是我的最终结果?
答案 0 :(得分:1)
ast.literal_eval
此消息有三个问题
decode('utf-8')
\\n
而不是\n
- 使用replace("\n", "\\n")
datetime
对象,因为它只能评估字符串,数字,元组,列表,dicts,布尔值和None。 (doc:ast.literal_eval)
但你可以删除字符串datetime.datetime
,然后你会得到一个字符串
可以评估。评估后你可以转换元组做日期时间
回来。
import datetime
import ast
data = b'{\'created_at\': datetime.datetime(2018, 5, 25, 13, 35, 11), \'tweet\': "RT @KKRiders: Mavi to bowl the first ball of #Qualifier2. Saha on strike. Let\'s go!\n\n#SRHvKKR #TeesraVaar #KKRHaiTaiyaar", \'id\': 1000007371131764736, \'sequence\': 1}'
data = data.decode('utf-8')
data = data.replace('\n', '\\n')
data = data.replace('datetime.datetime', '')
data = ast.literal_eval(data)
data['created_at'] = datetime.datetime(*data['created_at'])
print(data['created_at'])
print(data['tweet'])
答案 1 :(得分:1)
这有效:
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)
答案 2 :(得分:0)
ast.literal_eval
不支持datetime
个对象。对于像这样的幼稚对象,您可以发送其属性的元组,并在另一侧用datetime.datetime(*attrs)
重新构建它。如果酸洗是一种选择,你可以试试;它已经支持这样的对象了。