使用python中出现的报错

1.‘ascii’ codec can’t decode byte 0xbf in position 0: ordinal not in range(128)(未解决)

【场景】需要批量合并.xls文件
【背景】

  • .xls的文件编码为ansi
  • .xls文件中含有中文

【原代码】

import os
import pandas as pd
#读取文件夹内所有以.xls结尾的excel文件
excel = [
    pd.read_excel(fname)
    for fname in os.listdir("./")
    if ".xls" in fname
]
df =pd.concat(excel)#合并
df.to_excel("output.xlsx",index=False)#导出

【解决思路】
将文件换成编码为utf-8的文件,代码即可顺利执行——>目标更换位更改文件编码为utf-8
可以使用codecs模块(官方文档)(这个是python自带的模块,直接可以import codecs,不需要下载)

弯路1:

在自己程序代码前面加上以下几句

import sys#获取当前默认编码
reload(sys)#使用reload
sys.setdefaultencoding('utf8') #设置编码

【结果】报错:name ‘reload’ is not defined
【错误原因】此方法为python2的写法,但是在python3中这个需要已经不存在了(这么做也没有实际意义)

  • 在Python2.x中由于str和byte之间没有明显区别,经常要依赖于defaultencoding来做转换。
  • 在python3中有了明确的str和byte类型区别,从一种类型转换成另一种类型要显式指定encoding。
弯路2:

类比于弯路1,python3的替代方法

import importlib,sys 
importlib.reload(sys)

【结果】仍然出现该错误

2.Index([‘公司代码’], dtype=‘object’)

【场景】需要剔除.xlsx文件中“公司代码”列中的重复数据
【原代码】

import pandas as pd
people=pd.read_excel('E:\id.xlsx')
people.drop_duplicates(subset=['公司代码'],inplace=True,keep='first')
people.to_excel('E:\output.xlsx',index=False)

【解决思路】把‘公司代码’那一列的数据类型改一下。

import pandas as pd
people=pd.read_excel('E:\id.xlsx')
people['公司代码']=people['公司代码'].astype(str)#修改数据类型
people.drop_duplicates(subset=['公司代码'],inplace=True,keep='first')
people.to_excel('E:\output.xlsx',index=False)

参考

1.中文的csv文件的编码改成utf-8的方法
2.How to convert a file to utf-8 in Python?

你可能感兴趣的:(python,python)