如何将格式错误的字节转换为字典?

时间:2018-05-26 12:16:00

标签: python python-3.x

我有一个读取字节的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}'

如何将其视为字典,这是我的最终结果?

3 个答案:

答案 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)重新构建它。如果酸洗是一种选择,你可以试试;它已经支持这样的对象了。

相关问题