Pandas 带有希腊字符的数据框到 postgresql
Pandas dataframe with Greek characters to postgresql
我正在处理以下内容:
Python 3.9.2
Pandas1.3.4
PostgreSQL 14.1
我创建了一个示例数据框来探索 pandas 和 postgresql。
d = {'col1': ['Αθήνα', 'χαρύϊψχορες'], 'col2': ['Θεσσαλονίκη', 'Ξπφδ']}
df = pd.DataFrame(data=d)
当我调用 df 时在 Jypiter 上工作,我得到以下输出:
col1 col2
0 Αθήνα Θεσσαλονίκη
1 χαρύϊψχορες Ξπφδ
然后,我尝试使用以下代码将数据添加到 psql:
engine = create_engine('postgresql://user:password@localhost:port/test_db', encoding='utf-8-sig')
df.to_sql('sq_exp', engine)
如果我打开我的 CMD 到 select 数据,我得到这个错误:
test_db=# select * from sq_exp;
ERROR: character with byte sequence 0xce 0x91 in encoding "UTF8" has no equivalent in encoding "WIN1252"
在尝试修复此错误时,我将编码设置为 win1252 却得到了同样的错误:
test_db=# SET client_encoding TO 'WIN1252';
SET
test_db=# select * from sq_exp;
ERROR: character with byte sequence 0xce 0x91 in encoding "UTF8" has no equivalent in encoding "WIN1252"
根据postgres的文档,我将编码设置为WIN1253
https://www.postgresql.org/docs/current/multibyte.html
当我 select 数据:select * from sq_exp;
我得到以下输出:
test_db=# select * from sq_exp;
index | col1 | col2
-------+-------------+-------------
0 | ┴Φ▐φß | ╚σ≤≤ßδ∩φ▀Ωτ
1 | ≈ß±²·°≈∩±σ≥ | ╬≡÷Σ
如您所见,这与最初创建的 df 完全不同,我尝试了多种方法来解决它。请有人指导我如何做?
非常感谢!
[1]: https://i.stack.imgur.com/kkK3R.png
[2]: https://i.stack.imgur.com/49rAe.png
[3]: https://i.stack.imgur.com/8wIoq.png
[4]: https://i.stack.imgur.com/IsHVM.png
其实我已经发现了这个问题
好像是CMD不支持希腊字符,所以才报错:
ERROR: character with byte sequence 0xce 0x91 in encoding "UTF8" has no equivalent in encoding "WIN1252"
解决方法实际上是通过代码编辑器或数据库管理工具查看数据。
这是一个使用 Visual Studio 代码的示例:
import psycopg2
conn_string = "host='localhost' dbname='database_name' user='postgres' password='password'"
conn = psycopg2.connect(conn_string)
cursor = conn.cursor()
cursor.execute("SELECT * FROM sq_exp")
records = cursor.fetchall()
运行 以上实际上会打印出预期的输出:
[(0, 'Αθήνα', 'Θεσσαλονίκη'), (1, 'χαρύϊψχορες', 'Ξπφδ')]
同样适用于使用数据库应用程序工具
我正在处理以下内容: Python 3.9.2 Pandas1.3.4 PostgreSQL 14.1
我创建了一个示例数据框来探索 pandas 和 postgresql。
d = {'col1': ['Αθήνα', 'χαρύϊψχορες'], 'col2': ['Θεσσαλονίκη', 'Ξπφδ']}
df = pd.DataFrame(data=d)
当我调用 df 时在 Jypiter 上工作,我得到以下输出:
col1 col2
0 Αθήνα Θεσσαλονίκη
1 χαρύϊψχορες Ξπφδ
然后,我尝试使用以下代码将数据添加到 psql:
engine = create_engine('postgresql://user:password@localhost:port/test_db', encoding='utf-8-sig')
df.to_sql('sq_exp', engine)
如果我打开我的 CMD 到 select 数据,我得到这个错误:
test_db=# select * from sq_exp;
ERROR: character with byte sequence 0xce 0x91 in encoding "UTF8" has no equivalent in encoding "WIN1252"
在尝试修复此错误时,我将编码设置为 win1252 却得到了同样的错误:
test_db=# SET client_encoding TO 'WIN1252';
SET
test_db=# select * from sq_exp;
ERROR: character with byte sequence 0xce 0x91 in encoding "UTF8" has no equivalent in encoding "WIN1252"
根据postgres的文档,我将编码设置为WIN1253 https://www.postgresql.org/docs/current/multibyte.html
当我 select 数据:select * from sq_exp;
我得到以下输出:
test_db=# select * from sq_exp;
index | col1 | col2
-------+-------------+-------------
0 | ┴Φ▐φß | ╚σ≤≤ßδ∩φ▀Ωτ
1 | ≈ß±²·°≈∩±σ≥ | ╬≡÷Σ
如您所见,这与最初创建的 df 完全不同,我尝试了多种方法来解决它。请有人指导我如何做?
非常感谢! [1]: https://i.stack.imgur.com/kkK3R.png [2]: https://i.stack.imgur.com/49rAe.png [3]: https://i.stack.imgur.com/8wIoq.png [4]: https://i.stack.imgur.com/IsHVM.png
其实我已经发现了这个问题
好像是CMD不支持希腊字符,所以才报错:
ERROR: character with byte sequence 0xce 0x91 in encoding "UTF8" has no equivalent in encoding "WIN1252"
解决方法实际上是通过代码编辑器或数据库管理工具查看数据。
这是一个使用 Visual Studio 代码的示例:
import psycopg2
conn_string = "host='localhost' dbname='database_name' user='postgres' password='password'"
conn = psycopg2.connect(conn_string)
cursor = conn.cursor()
cursor.execute("SELECT * FROM sq_exp")
records = cursor.fetchall()
运行 以上实际上会打印出预期的输出:
[(0, 'Αθήνα', 'Θεσσαλονίκη'), (1, 'χαρύϊψχορες', 'Ξπφδ')]
同样适用于使用数据库应用程序工具