2016-09-12 2 views
5

Python3를 들어 GZIP 파일로 압축 된 JSON 객체를 쓰기 읽기, 나는이와 @Martijn Pieters's code 다음 :파이썬 3, /는 /에서

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

@Bakuriu 아니요, 같은 오류입니다. –

답변

17

네 가지 변환 단계가 있습니다.

  1. 파이썬 데이터 구조 (중첩 dicts, 목록, 문자열, 숫자, 부울)
  2. 데이터 구조 ("JSON")을 함유 바이트
  3. 목록의 직렬화 된 표현을 포함한 파이썬 문자열 해당 문자열 ("UTF-8") ("gzip을") 그 이전 바이트 목록의 표현을 포함한 바이트
  4. 목록의 표현은

그래서 한 이러한 단계를 보자. "\n"를 추가

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)      

참고 여기에 완전히 불필요. 그것은 아무 것도 망가 뜨리지 않지만 그 이상의 용도는 없습니다. 단계를 조합 할 수 물론

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

Ooops. 죄송합니다. Upvoted! 대부분의 사람들 (나를 포함해서)이 대답을 받아들이면 자동 upvote를 제공한다고 생각합니다. 그래서 그렇게 설정해야합니다. 추신. 개인적으로 가져 가지 마십시오. –