我在postgres DB中有一列数据类型为byta,编码为compressed_json。如何读取此列的值并在Python中获得正确的json?
但是gzip.compress和decompress方法没有显示。也许这是我的gzip模块的版本问题。无论如何,我能够使用以下方式解压缩:
-
将列转换并存储为字节数组:-
payload = bytearray(row[0])
-
对于解压缩,使用以下代码片段:
fileobj = cStringIO.StringIO(payload) gzf = gzip.GzipFile('dummy-name', 'rb', 9, fileobj) decomprJson = gzf.read()
我现在没有时间给出一个完整的工作示例。相反,我将提供一个大纲:
- 从数据库中读取列
data = cur.fetchone()[0]
- 使用Python gzip模块
json_data = gzip.decompress(data)
其中json_data是一个字节对象。
- 使用Python json模块读取json_data
更新。示例:
create table js_compressed(js_fld bytea);
js_str = b'[{"one": 1, "two": 2}, {"three": 3, "four": 4}]'
js_cmp = gzip.compress(js_str)
con = psycopg2.connect("dbname=test user=aklaver host=localhost")
cur = con.cursor()
cur.execute("insert into js_compressed(js_fld) values(%s)", (psycopg2.Binary(js_cmp,),))
cur.execute("select js_fld from js_compressed limit 1")
js_fld = cur.fetchone()[0]
dc_fld = gzip.decompress(js_fld).decode()
json.loads(dc_fld)
[{'one': 1, 'two': 2}, {'three': 3, 'four': 4}]