2016-09-12 30 views
5

Python3 için gzip dosyasına sıkıştırılmış json nesneleri yazma okuma Ben bununla @Martijn Pieters's code izledi:Python 3,// ​​dan

import gzip 
import json 

# writing 
with gzip.GzipFile(jsonfilename, 'w') as fout: 
    for i in range(N): 
     uid = "whatever%i" % i 
     dv = [1, 2, 3] 
     data = json.dumps({ 
      'what': uid, 
      'where': dv}) 

     fout.write(data + '\n') 

ama bu hatayla sonuçlanır:

Traceback (most recent call last): 
    ... 
    File "C:\Users\Think\my_json.py", line 118, in write_json 
    fout.write(data + '\n') 
    File "C:\Users\Think\Anaconda3\lib\gzip.py", line 258, in write 
    data = memoryview(data) 
TypeError: memoryview: a bytes-like object is required, not 'str' 

Herhangi bir düşünce hakkında ne oluyor?

+0

kod muhtemelen akılda python2 ile yazılmış

Okuma tersi tam olarak çalışır . Verileri kodlamaya çalışın: '(data + '\ n') kodlayın ('utf-8')'. – Bakuriu

+0

@Bakuriu Hayır, aynı hata. –

cevap

17

Burada dört adımlık dönüşümünüz var.

  1. bir Python veri yapısı (iç içe dicts, listeler, dizeleri, sayılar, boolean)
  2. bu veri yapısı ("JSON") bir içeren bayt
  3. bir liste bir seri hale getirilmiş gösterimi içeren bir Python dize İpin ("UTF-8") ("gzip") önceki bayt listesinin bir temsilini içeren bayt
  4. bir liste temsili

Yani tek bu adımları teker teker ele alalım. "\n" ekleyerek

import gzip 
import json 

data = [] 
for i in range(N): 
    uid = "whatever%i" % i 
    dv = [1, 2, 3] 
    data.append({ 
     'what': uid, 
     'where': dv 
    })           # 1. data 

json_str = json.dumps(data) + "\n"    # 2. string (i.e. JSON) 
json_bytes = json_str.encode('utf-8')   # 3. bytes (i.e. UTF-8) 

with gzip.GzipFile(jsonfilename, 'w') as fout: # 4. gzip 
    fout.write(json_bytes)      

Not burada tamamen gereksizdir. Hiçbir şey kırmaz, bunun ötesinde hiçbir faydası yoktur. adımlar kombine edilebilir Elbette

with gzip.GzipFile(jsonfilename, 'r') as fin: # 4. gzip 
    json_bytes = fin.read()      # 3. bytes (i.e. UTF-8) 

json_str = json_bytes.decode('utf-8')   # 2. string (i.e. JSON) 
data = json.loads(json_str)      # 1. data 

print(data) 

:

with gzip.GzipFile(jsonfilename, 'w') as fout: 
    fout.write(json.dumps(data).encode('utf-8'))      

ve

with gzip.GzipFile(jsonfilename, 'r') as fin: 
    data = json.loads(fin.read().decode('utf-8')) 
+0

Ne müthiş ve düşünceli bir cevap. Şuan çalışıyor. Teşekkürler! –

+0

Müthiş ve düşünceli bir cevap, ama görünüşe göre bir oylamaya layık değil. Anlamadım - niçin size yardımcı olan bir cevaba "bu yardımcı oldu" u tıklamamanız gerekir? Bunu çok görüyorum ve yardım edemem ama nedenleri merak ediyorum. – Tomalak

+0

Ooops. Afedersiniz. Upvoted! Sanırım çoğu insan (benim dahil), bir cevabı kabul ederek otomatik bir geri bildirim sağladığını düşünür. O muhtemelen bu şekilde kurulmalıdır. ps. Kişisel olarak alma. –