猿问

将 json 导入 Postgres 时的编码问题

我正在使用熊猫,并将数据导出为 json,如下所示:


import pandas as pd

df = pd.DataFrame({'a': ['Têst']})


df.to_json(orient='records', lines=True)

> u'{"a":"T\\u00east"}'

这是有道理的,因为我们有一个00ea前缀为 的 Unicode 字符,\u并且\在转换为 JSON 时会转义为


但是然后我将 JSON 字符串导入到 Postgres 中 COPY


buffer = cStringIO.StringIO()

buffer.write(df.to_json(orient='records', lines=True))

buffer.seek(0)


with connection.cursor() as cursor:

  cursor.copy_expert(sql="""

  COPY tmp (json_data) FROM STDIN WITH NULL AS '' ENCODING 'UTF8';

  """, file=buffer)

问题是数据库中的结果最终是


{"a": "Tu00east"}

正如你所看到的那样,双人\\消失了。


我尝试使用CSVCOPY 模式,但由于某些数据中有逗号,因此将事情搞砸了,并且尝试将 ESCAPE 字符和 DELIMITER 设置为其他内容似乎总是会导致失败。


表列有一个jsonb类型。我在文档中读到 PG 不喜欢 \x003f 上的非 ASCII Unicode,除非 DB 编码是 UTF8,在我的情况下,这应该不是问题。


我想弄清楚为什么这里要删除转义字符,以及如何导入 Postgres 并保存编码。


泛舟湖上清波郎朗
浏览 166回答 1
1回答

PIPIONE

将 csv 选项用于COPY, 和DELIMITER e'\x01' QUOTE e'\x02'。我不确定这是否适用于所有可能的有效 JSON,但我从来没有失败过。$ psql -X testdb -c 'create table t(d jsonb)'CREATE TABLE$ cat foo.json{"a":"Têst"}$ cat foo.json | psql -X testdb -c "COPY t from stdin csv delimiter e'\x01' quote e'\x02'" COPY 1$ psql -X testdb -c 'select * from t';                                                           d       --------------- {"a": "Têst"}(1 row)
随时随地看视频慕课网APP

相关分类

Python
我要回答