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í.
- una estructura de datos de Python (dictados anidados, listas, cadenas, números, booleanos)
- una cadena Python que contiene una representación serializada de esa estructura de datos ("JSON")
- una lista de bytes que contienen una representación de esa cadena ("UTF-8")
- 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''))