json python-3.x gzip

Python 3, lee/escribe objetos json comprimidos desde/a archivo gzip



python-3.x (1)

Para Python3, seguí el código de @Martijn Pieters con esto:

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

pero esto resulta en un error:

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

¿Alguna idea sobre lo que está pasando?


Tienes cuatro pasos de transformación aquí.

  1. una estructura de datos de Python (dictados anidados, listas, cadenas, números, booleanos)
  2. una cadena Python que contiene una representación serializada de esa estructura de datos ("JSON")
  3. una lista de bytes que contienen una representación de esa cadena ("UTF-8")
  4. una lista de bytes que contiene una representación de esa lista de bytes anterior ("gzip")

Así que vamos a dar estos pasos uno por uno.

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)

Tenga en cuenta que agregar "/n" es completamente superfluo aquí. No rompe nada, pero más allá de eso no sirve de nada.

La lectura funciona exactamente al revés:

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)

Por supuesto que los pasos se pueden combinar:

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

y

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