对python中open函数的偷梁换柱

前言

很好玩, 有兴趣的可以看完

开始操作

我给出一段代码(没有用with)

f=open(r'C:\Users\520\PycharmProjects\pythonProject1\mysql\student.csv')
print(f.read())
f.close()

这段代码的意思是打开一个csv文件,读取其中的数据。最后关闭文件。

因为我是读取文件,而open函数的默认方式mode='r',所以'r'可以不写,运行。

报错了,我的csv文件是utf-8保存的

#UnicodeDecodeError: 'gbk' codec can't decode byte 0xa7 in position 35: illegal multibyte sequence

在习惯上,我如果要改的话,加个encoding='utf-8',运行没问题。

正文

可以,我突然有个想法,这里面有个很关键的东西,编码错误gbk,

难道open函数的默认编码是gbk?(我用的pycharm)

我鼠标对着open,按ctrl+b,进入open函数,看看。

进去后

def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True): # known special case of open

看到的这样的,后面一大段注释,没有说open函数是怎么实现的,只说了怎么用的。。。

但是可以看到它的encoding=None,没有写默认编码的,给我整不会了

我于是改一下,把encoding的None改了

encoding='utf-8’

我想应该不会报错了把。一运行,还是报错,

UnicodeDecodeError: 'gbk' codec can't decode byte 0xa7 in position 35: illegal multibyte sequencecc

什么情况?????

(我可以在open函数里面中,写个utf-8,但是我就是不写,就是玩!!!!)

于是,对open函数前面打个断点。进行调试。看看到底是什么情况,怎么运行的。。。。。。

调试的时候,并不能跳进open函数里面,但是给出了open的返回值

<_io.TextIOWrapper name='C:\\Users\\520\\PycharmProjects\\pythonProject1\\mysql\\student.csv' mode='r' encoding='cp936'>

注意到encoding='cp936',?????

什么鬼东西,什么编码,去网上搜搜,cp936。

总之,就是说cp936就是gbk的意思。

然后,为什么???,多次调试,没有什么鬼用。我也进不去open函数的源代码,也不知道怎么实现的。GG

转折

在pycharm,按两次shift,可以进行搜索,全部搜索。搜索cp936,找到6个文件。如图。

1,2,3,6都是txt文件,没有什么用,第5个文件进去后是个test文件,也没有什么用,唯一值得怀疑的,就是第4个,而且非常值得怀疑,进去后,

全都是编码,而且是个字典,可以看出,cp936对应gbk。既然如此,我把gbk直接改成utf-8,然后

UnicodeDecodeError: 'mbcs' codec can't decode bytes in position 0--1: No mapping for the Unicode character exists in the target code page.

又出现了一个编码,。。。用调试模式看看,一顿操作,没看懂,运行到这个codecs.py

这个函数里面的这个地方就会报错(截取下来的)
def decode(self, input, final=False):        
            (result, consumed) = self._buffer_decode(data, self.errors, final)
# 。。。

GG

再次转折

我在哪个含有cp936的文件aliases中搜索utf-8,没有,只有utf_8 。有趣,有趣。

所以,很显然,我把utf-8改成utf_8,如图

再次运行

f=open(r'C:\Users\520\PycharmProjects\pythonProject1\mysql\student.csv')
print(f.read())
f.close()

没有报错,可以

总结

算不算对open函数的偷梁换柱,哈哈哈哈哈哈哈哈。

(因为我大部分文件都是utf-8,要打开的话,不写编码,会报错)。

可惜我并不知道,到底是怎么运行的,因为我确实找不到open函数到底怎么运行的源文件。

(builtins.py,不是这个文件,只有用法)

哎!!!!

学习!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值