Python 将json导入Postgres时出现编码问题
我使用pandas,并将数据导出为json,如下所示:Python 将json导入Postgres时出现编码问题,python,postgresql,pandas,unicode,Python,Postgresql,Pandas,Unicode,我使用pandas,并将数据导出为json,如下所示: import pandas as pd df = pd.DataFrame({'a': ['Têst']}) df.to_json(orient='records', lines=True) > u'{"a":"T\\u00east"}' 这是有意义的,因为我们有一个Unicode字符00ea前缀\u,当转换为JSON时,它会用\转义 然后我用COPY buffer = cStringIO.StringIO() buffer.wr
import pandas as pd
df = pd.DataFrame({'a': ['Têst']})
df.to_json(orient='records', lines=True)
> u'{"a":"T\\u00east"}'
这是有意义的,因为我们有一个Unicode字符00ea
前缀\u
,当转换为JSON时,它会用\
转义
然后我用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"}
正如你所看到的,双重\\
已经消失了
我尝试使用CSV
作为复制模式,但由于某些数据中有逗号,因此它会把事情搞砸,并且尝试将转义字符和分隔符设置为其他内容似乎总是会导致失败
表列具有jsonb
类型。我在文档中读到PG不喜欢\x003f上的非ASCII Unicode,除非DB编码是UTF8,在我的例子中就是UTF8,所以这不应该是一个问题
我试图弄清楚为什么这里要删除转义字符,以及如何导入到Postgres并保留编码。使用csv选项进行
复制
,并使用分隔符e'\x01'引号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)
好的,很有趣。你能解释一下为什么是\x01和\x02吗?我猜任何在数据中找不到的东西,对吗?似乎CSV的诀窍是避免任何常见字符。我试图设定报价,逃跑等等。。。这就是我所拥有的,但我看到了其中的诀窍,因为PG需要按原样获取字符串,因为它们已经转义并正确编码了。那么导入时的编码支持呢?