【问题标题】:msgpack unpacks the number '10' between each itemmsgpack 解包每个项目之间的数字“10”
【发布时间】:2016-10-19 13:30:19
【问题描述】:

我正在尝试使用msgpack 将字典列表写入文件。但是,当我遍历Unpacker 的实例时,似乎10 的数字在每个“真实”文档之间被解包。

我正在运行的测试脚本是

import msgpack
from faker import Faker
import logging
from logging.handlers import RotatingFileHandler

fake = Faker()
fake.seed(0)

data_file = "my_log.log"

logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)
handler = RotatingFileHandler(data_file, maxBytes=2000, backupCount=10)
logger.addHandler(handler)

fake_dicts = [{'name': fake.name()} for _ in range(100)]

for item in fake_dicts:
    dump_string = msgpack.packb(item)
    logger.debug(dump_string)

unpacker = msgpack.Unpacker(open(data_file))

for unpacked in unpacker:
    print unpacked

我使用fake-factory 生成虚假数据的地方。结果打印输出如下:

{'name': 'Joshua Carter'}
10
{'name': 'David Williams'}
10
{'name': 'Joseph Jones'}
10
{'name': 'Gary Perry'}
10
{'name': 'Terry Wells'}
10
{'name': 'Vanessa Cooper'}
10
{'name': 'Michael Simmons'}
10
{'name': 'Nicholas Kline'}
10
{'name': 'Lori Bennett'}
10

我不明白为什么每个字典之间都印有数字10?这是logger 以某种方式引入的吗?

【问题讨论】:

  • 我的第一个想法是将换行符(Unicode 10)转换为整数。试试print msgpack.packb(item)直接打印,看看是那里介绍的还是Unpacker里面介绍的。
  • 它似乎确实来自记录器引入的换行符。我将尝试在stackoverflow.com/questions/7168790/… 之后使用handler.terminator = ""(升级到Python 3 之后)。

标签: python


【解决方案1】:

这是来自 unpacker 的内容。你可以像这样复制自己:

In [23]: unpacker = msgpack.Unpacker(open(data_file))

In [24]: unpacker.next()
Out[24]: {'name': 'Edward Ruiz'}

In [25]: unpacker.next()
Out[25]: 10

【讨论】:

  • 关于如何防止10s 首先进入msgpack 有什么想法吗?
  • 我之前没有使用过 msgpack,但我在这里简要查看了规范:github.com/msgpack/msgpack/blob/master/spec.md。乍一看,这似乎不是 30 秒内的预期行为。
  • 生成器表达式可能会很好地处理这个问题:dabeaz.com/generators
  • 我很确定换行符来自logger,因为在 Python 3 中使用(人类可读的)JSON 而不是 msgpack 的脚本版本中,我可以看到handler.terminator = "" 命令。
  • 可能禁用日志记录:stackoverflow.com/questions/2266646/…
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 2016-03-28
  • 2016-11-09
  • 2018-03-18
  • 2022-08-24
相关资源
最近更新 更多