본문 바로가기
파이썬

파이썬 Python 3, gzip 파일에서 압축 된 json 객체 읽기 / 쓰기

by º기록 2020. 10. 30.
반응형


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'

무슨 일이 일어나고 있는지에 대한 생각이 있습니까?

 

해결 방법

 

여기에 4 단계의 변형이 있습니다.

따라서 이러한 단계를 하나씩 수행해 보겠습니다.

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

 

참조 페이지 https://stackoverflow.com/questions/39450065

 

 

반응형

댓글