Python 用Pandas 读取文件数据以\ufeff开头

1.发现问题

今天在用Python处理csv数据文件的时候发现一个问题:

ValueError: time data '\ufeff20210923' does not match format '%Y%m%d' (match)

这个时候如果用pandas的read_csv 打开文件阅读是不会直接显示\ufeff,只是和别的数据不对齐:

明显可以看出第0行数据是比其他行数据长度不一致,打印字符串长度知道第一条数据比其他都数据多一个字符,也就是刚才报错中的\ufeff(叫做“零宽无间断间隔”又被称为BOM)。

然后以记事本方式打开文件,看到文件属性果然是带BOM的UTF

 

来源百度百科:

UTF-8:以字节为编码单元,它的字节顺序在所有系统中都是一様的,没有字节序的问题,也因此它实际上并不需要BOM(“ByteOrder Mark”)。但是UTF-8 with BOM即utf-8-sig需要提供BOM

字节顺序标记(英语:byte-order mark,BOM)是位于码点U+FEFF的统一码字符的名称。

UTF-8则没有字节顺序的议题,UTF-8编码过的字节顺序标记则被用来标示它是UTF-8的文件,它只用来标示一个UTF-8的文件,而不用来说明字节顺序。许多视窗程序(包含记事本)会添加字节顺序标记到UTF-8文件。然而,在类Unix系统(大量使用文本文件,用于文件格式,用于进程间通信)中,这种做法则不被建议采用。因为它会妨碍到如解译器脚本开头的Shebang等的一些重要的码的正确处理。所以它也会影响无法识别他的变成语言。

字节顺序标记在UTF-8中被表示为序列EF BB BF

2.解决问题

知道问题所在了就开始着手解决带\efff开头的数据,修改编码方式在读取文件过程中把encoding = ‘utf-8’ 改成 utf-8-sig即可:

再次运行还是会报错,因为我的文件夹路径中有中文,所以read_csv需要两步进行,然而我在oepn(file)的时候告诉他编码形式是utf-8-sig了,第二次pandas 读取文件的时候我并没有再次声明它的字节顺序,所以还是没有彻底取消掉\ufeff,所以需要在第二次read_csv的时候再次声明encoding= ‘utf-8-sig’。

(注意:两次的读取文件的encoding都要声明utf-8编码,第二次必须声明字节顺序。)

Process finished with exit code 0!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值