pandas数据库查询及导出乱码问题

1. 场景:执行以下查询,查看pycharm Sciview,可以看到乱码,因为查询结果有西欧语言(如:ÿum)

df_rows = pd.read_sql_query(sql, engine)

 

 

2. 原因:

(1)查看DB字符集,结果是:WE8ISO8859P1  (ISO8859)

select * from nls_database_parameters where parameter ='NLS_CHARACTERSET';

(2)查看当前默认字符集为,结果为:ASCII

>>> import sys
>>> sys.getdefaultencoding()
'ascii'

(3)原因很明显,ISO-8859-1对应为西欧语言,范围大于ASCII(参考:https://zh.wikipedia.org/wiki/ISO/IEC_8859-1),导致乱码

 

 

3. 解决:可以在执行DB查询后为该列解码

df_rows['description'] = df_rows['description'].apply(lambda x: str(x).decode('ISO-8859-1'))

 

 

4. 由于ISO-8859-1向下兼容ASCII, 使用json直接解析时也会异常,由于ASCII不足以解析0xff范围内字符,需编码

# 错误的json解析方式
json.loads(df_rows.to_json(orient='records'))  
# 正确的json解析方式
json.loads(df_rows.to_json(orient='records'), encoding='ISO-8859-1')

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用pandas从MySQL数据库读取数据并导出到Excel的步骤: 1. 首先,确保已经安装了必要的依赖包,包括PyMySQL、pandas、sqlalchemy和openpyxl。可以使用以下命令进行安装: ```shell pip install PyMySQL pandas sqlalchemy openpyxl ``` 2. 导入所需的库: ```python import pandas as pd from sqlalchemy import create_engine ``` 3. 创建与MySQL数据库的连接: ```python # 创建数据库连接 engine = create_engine('mysql+pymysql://username:password@host:port/database_name') ``` 请将`username`、`password`、`host`、`port`和`database_name`替换为实际的数据库连接信息。 4. 使用pandas的`read_sql_query`函数从数据库中读取数据: ```python # 读取数据 query = 'SELECT * FROM table_name' df = pd.read_sql_query(query, engine) ``` 请将`table_name`替换为实际的表名。 5. 对数据进行必要的处理和转换。 6. 使用pandas的`to_excel`函数将数据导出到Excel文件: ```python # 导出数据到Excel df.to_excel('output.xlsx', index=False) ``` 请将`output.xlsx`替换为实际的输出文件名。 以下是一个完整的示例代码: ```python import pandas as pd from sqlalchemy import create_engine # 创建数据库连接 engine = create_engine('mysql+pymysql://username:password@host:port/database_name') # 读取数据 query = 'SELECT * FROM table_name' df = pd.read_sql_query(query, engine) # 对数据进行必要的处理和转换 # 导出数据到Excel df.to_excel('output.xlsx', index=False) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值