2016-09-12 2 views
5

へ/から圧縮されたJSONオブジェクトを読み出し/書き込み、私はこれで@Martijn Pieters's codeを追っ:のPython 3は、のpython3のGzipファイル

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') 

が、これはエラーになります:

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' 

任意の考えについて何が起こっている?

+0

コードはおそらく念頭にpython2で書かれた

読書は、他の方法で回避正確に動作します。データのエンコードを試みてください: '(data + '\ n')。encode( 'utf-8')'。 – Bakuriu

+0

@バクリオーいいえ、同じエラーです。 –

答えて

17

ここでは、4つのステップがあります。

  1. Pythonのデータ構造(ネストされた辞書、リスト、そして文字列、文字列、数値、ブール値)
  2. そのデータ構造(「JSON」)の直列化表現を含むPython文字列
  3. 含むバイトのリストその文字列の表現(「UTF-8」)
  4. その前のバイトのリスト(「GZIP」)の表現を含むバイトのリスト

それでは、これらのステップを一つずつ見てみましょう。

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)      

ここでは、"\n"を追加することは完全に不要です。それは何も壊すことはありませんが、それ以上は役に立たないのです。手順は組み合わせることができます。もちろん、

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'))      

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

すごく慎重な答え。それは今働く。ありがとう! –

+0

素晴らしいと思慮深い答えは、まだ明らかにupvoteの価値がない。私はそれを取得しない - あなたはなぜあなたに役立った答えに "役立った"をクリックしないだろうか?私はこれを多く見て、私は助けることはできませんが、その理由を不思議です。 – Tomalak

+0

ごめんなさい。アップアップされました!私は、ほとんどの人(私を含む)が答えを受け入れることによって自動upvoteを提供すると思っています。おそらくSOはそのように設定する必要があります。 ps。それを個人的に服用しないでください。 –

関連する問題