python打开文件_Python打开文件乱码问题

9202308ab9ed02f49d5866eb7cd7d1e5.png

内容预览:1、读取文件碰到的问题。2、读取文件设置编码。3,读取文件编码时2和3的区别以及兼容性问题。

读取文件碰到的问题

我用python读文件内容的时候,抛了个错误,说是UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 16: illegal multibyte sequence,意思说是gbk解码器无法解码,错误长这个样子:

0b1a7427cb6c6c9110fb1eb2088c2e2b.png

这错误太常见了,白话说就是编码肯定有个地方设置的不一样导致的错误,好了,知道原因排除下就可以了,于是我从最开始进行了排查:

首先,我确认了test.txt的编码,它是UTF-8,其次我检查了python文件,它也是UTF-8,并且我也加上了# -*- coding:UTF-8 -*-标识。

cd7610ba1cf9bf0f1210a4741e4976ed.png

完事后我重新运行了文件,既然还是报乱码错误,?,哪一步的编码没有设置?,想了想明白了,命令行打开默认是gbk编码,于是我运行了个chcp命令,返回了936,然后使用了chcp 65001命令,修改了命令行的编码方式。936代表gbk,65001代表utf-8,只对当前命令行生效。

a0e55b5249e9cf2b06256bbe4df57987.png

这里还是报错就奇怪了,因为从源头txt到最后的命令行基本都统一编码了,还报错只能说明这个过程中肯定有个地方编码使用的是gbk,最后把这个错误定位到了with open这里,with open它读文件时有一个自己的编码,它可以通过encoding参数用来指定打开文件使用哪种编码。

c107342d05e84e728e3e0c1dfe180d43.png

问题看似解决了,但还是有很多疑问。使用encoding后,没有报错只能说明一个问题,with open默认不是UTF-8,奇怪了,python默认编码就是UTF-8呀,于是,我去命令行验证了下,python的默认编码。

18d19156aa52083b434eceb422e86e6f.png

py2给的是ascii,py3给的是utf-8,刚才我是用py3执行的,结果是报错的。这种情况解释就一种,with open默认编码使用的不是python的。如果要验证只能翻官方文档说明了,于是找到了下面这段话。

10c2e0b134cebdb7e88cfac33340a430.png

大概翻译一下:with open可以通过encoding来指定编码,它默认使用的编码方式是以平台为准的,无论locale.getpreferredencoding返回的编码是什么。

读取文件设置编码

其实上面的过程,直接通过encoding指定编码就可以了,但我还是把遇到的问题过程记录了下,个人认为,本质性的东西是很重要的。所以设置文件编码方式就是上面说的,encoding来指定,示例如下。

# -*- coding:UTF-8 -*-with open('C:/test2.txt', 'r', encoding="UTF-8") as f:  print(f.readline())

PS:有一次我指定了encoding为utf8,但报错了,后来了解到,统一正规的写法是UTF-8,utf8只有部分程序可以识别,并不是所有程序认它,所以建议大写。

上面是第一种写法,后来发现了另一种写法,通过引入codecs模块来指定处理文件时的编码,示例是这样的。

21984bcfb1760a7e5601322a6875c5a1.png

对比一下:codecs模块和第一种的with open区别在于使用了我codecs后第三个参数encoding你可以省去键encoding,表面看起来确实是这样的,难道就仅仅是因为少打了几个字母么?于是就有个问题:codecs和open的encoding区别是什么?

读取文件编码2和3的区别

看到标题相比就知道他们区别了,没错,codecs是用于py2,py2那时候的open函数不支持encoding参数,那怎么解决乱码问题,使用codecs。我特意用py2去试了下。

3ec1d63b2431d46ee6d1ce3ac98853cc.png

拓展:py3是支持open带encoding的,同时,我们也发现py3中codecs也可以用。那使用场景就很清晰了,py2用codecs,py3用encoding,如果要写兼容2和3的程序,就用codecs。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值