首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python导入utf8报错可能不是数据文件的问题

昨天在Mac上跑一个Python脚本的时候发生了一个特别诡异的事情。之前测试得好好的脚本突然报错了。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 330: invalid start byte

我以为是新拿到的数据文件有问题,就用上个月跑通的数据文件测试了一下,结果依然报错。

看到这个提示,认为是数据文件的编码问题,毕竟提到了utf-8不能decode。就用Sublime把文件打开然后Save with Encoding里选择了Utf-8。结果还是报错。。。。

在网上搜了一下,有人说先把文件open一下加上参数rb, 读成二进制文件然后再传给read_csv,我试了一下依然报错。

因为数据文件是别的同事发给我的,我怀疑是不是同事用的Windows,可能csv文件被打开再保存过产生编码变化了?我就把脚本和数据文件拷到Windows机上跑了一遍。(windows环境下要把代码里路径上的/换成\)

结果。。。。跑通了。。。。

查了半天,百思不得其结。在Mac上调试了好几次,突然发现有一次在报错的时候print(path)显示了一个数据文件夹下的目录./DS_Store。看着眼熟,记得之前在Mac下拷贝到U盘上的东西在Windows下看目录里会多这么个目录还有其他几个文件而且还都是隐藏的。

查了一下,它们都是Mac系统记录用户对当前文件夹的一些个性化选择使用的。比如用户对当前文件的展示方式(小图标,列表,排序,整理方式)进行调整后,Mac系统就会在当前文件夹下生成./DS_Store。所以,可能是我在之前调试成功后,对数据文件夹做过列表展示之类的操作,导致Mac系统在数据文件夹下生成了这个隐藏目录,而我的脚本是遍历数据文件夹的,读到这个隐藏文件夹里的文件后用Utf8 Decode就报错了。Windows下没有这个文件夹就能跑通。

在网上搜了一下,也有很多人抱怨这个问题,找到了删除和不再让Mac继续生成这个.DS_Store的方法,粘贴如下:

打开终端窗口,并输入删除命令:

sudo find / -name ".DS_Store" -depth -exec rm {} ;

按下回车键盘之后,终端会提示用户名和密码,直接输入密码再按回车即可。

删除后继续在终端输入:

defaults write com.apple.desktopservices DSDontWriteNetworkStores true

然后按下回车,就可以防止 .DS_Store 文件的再生了。

然后输入命令,删除已经生成的 .DS_Store文件:

find / -name ".DS_Store" -type f -delete

跟做数据开发的大拿同事讨论了一下,同事说“这就体现了git的好处,git有个.gitignore文件,可以排除不要的文件、目录等,不会进到代码里。”

看来,又要补充点git方面的知识了。感觉我这个数据分析师在程序员的道路上越走越远了。哈哈。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190222G0GNZD00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券