Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将json导入Postgres时出现编码问题_Python_Postgresql_Pandas_Unicode - Fatal编程技术网

Python 将json导入Postgres时出现编码问题

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

我使用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.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需要按原样获取字符串,因为它们已经转义并正确编码了。那么导入时的编码支持呢?