pandas使用read_sql遇到的编码问题('latin-1' codec can't encode characters in position 12-15: ordinal not in r)

用SQLAlchemy连接mysql数据库来读取数据到pandas的Dataframe中可以直接使用pandas中的read_sql方法,该方法返回以sql查询结果组成的Dataframe。其中的con参数可以使用SQLAlchemy中的engine来建立数据库连接来读取数据。index_col是一个list,列表中的列将成为返回的Dataframe中的index(如果包含多个列则为multi_index),chunksize如果设置了

   pandas.read_sql(sqlconindex_col=Nonecoerce_float=Trueparams=Noneparse_dates=Nonecolumns=Nonechunksize=None)

     下面就举一个简单的例子:

 

from sqlalchemy import create_engine 
import pandas as pd
#连接DB_ADDRESS下的dbname数据库,将username和password替换一下即可
engine = create_engine("mysql://username:"+'password'+"@{}/{}".format(DB_ADDRESS,dbname),encoding='utf-8')
#将sql语句执行结果存到return_df中,并以date_id列作为dataframe索引。
return_df=pd.read_sql('select * from ...',engine,index_col=['date_id'])
print return_df

  这个方法足以应对大部分的数据库查询工作,但是今天遇到了一个问题,在mysql查询语句中包含中文字符时,程序报错:

 

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 12-15: ordinal not in range(256)

看字面意思好像是SQLAlchemy内部默认会将sql语句用‘latin-1’进行编码,我们希望其使用utf-8来对其进行编码,这可以在创建engine中设置,设置方法如下:

 

engine = create_engine("mysql://username:"+'password'+"@{}/{}?charset=utf8".format(DB_ADDRESS,stockdb),encoding='utf-8')

这样就可以将SQLAlchemy内部默认编码方式改成utf8,程序就不会报错了。

 

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用pandas中的read_excel函数时,如果遇到UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf2 in position 10: invalid continuation byte 错误,意味着在读取excel文件时,遇到了无法解码的字节。这种情况通常是由于文件中包含了非UTF-8编码的字符造成的。为了解决这个问题,可以尝试以下几种方法: 1. 将编码方式改为GBK:使用encoding参数将编码方式改为gbk,如下所示: ```python data = pd.read_excel('filename.xlsx', encoding='gbk') print(data.head()) ``` 这样可以尝试使用gbk编码来读取文件,解决无法解码的问题。 2. 指定正确的编码:如果你知道文件的编码方式,你可以尝试将encoding参数设置为正确的编码方式,例如'utf-16'或'latin-1',如下所示: ```python data = pd.read_excel('filename.xlsx', encoding='utf-16') print(data.head()) ``` 这样可以确保使用正确的编码方式来读取文件,避免解码错误。 3. 检查文件内容:如果以上方法仍然无法解决问题,可能是因为文件本身存在非法字符或损坏。你可以尝试打开文件并检查文件内容,确保文件中的所有字符都符合所使用编码方式。 综上所述,当遇到UnicodeDecodeError错误时,可以尝试改变编码方式、指定正确的编码或检查文件内容来解决问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【pandas问题】UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xca in position 0: invalid ...](https://blog.csdn.net/weixin_50497501/article/details/127426231)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte 0xcf in position 0: invalid continuation by](https://blog.csdn.net/shaock2018/article/details/124061088)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值