2016-10-19 59 views
1

我試圖用msgpack將一個字典列表寫入文件。但是,當我迭代Unpacker的實例時,似乎在每個「真實」文檔之間解壓縮數字10msgpack解開每個項目之間的數字'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介紹嗎?

+2

我的第一個想法是將換行符(Unicode 10)轉換爲整數。試試'print msgpack.packb(item)'直接打印它,看它是在那裏還是在解包器中被引入。 –

+0

它似乎確實是來自記錄器引入的換行符。我將嘗試使用'handler.terminator =「」'在http://stackoverflow.com/questions/7168790/suppress-newline-in-python-logging-module(在升級到Python 3之後)。 –

回答

2

這是來自解包器的內容。你可以這樣複製自己:

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

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

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

關於如何防止'10'進入'msgpack'首先有什麼想法? –

+0

我之前沒有使用過msgpack,但我在這裏簡單地看過這個規範:https://github.com/msgpack/msgpack/blob/master/spec.md。這看起來第一眼看起來應該是30秒的預期行爲。 –

+0

一個生成器表達式可能會很好地處理這個問題:http://www.dabeaz.com/generators/ –

相關問題