前言
很好玩, 有兴趣的可以看完
开始操作
我给出一段代码(没有用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个文件。如图。
![](https://img-blog.csdnimg.cn/img_convert/9a0004f89e1b4c8a8f1e550b8d84da19.png)
1,2,3,6都是txt文件,没有什么用,第5个文件进去后是个test文件,也没有什么用,唯一值得怀疑的,就是第4个,而且非常值得怀疑,进去后,
![](https://img-blog.csdnimg.cn/img_convert/f712f7b32e5147ac986a8bfe311500fc.png)
全都是编码,而且是个字典,可以看出,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,如图
![](https://img-blog.csdnimg.cn/img_convert/a3f6f8c04eb84391aedcdc8430113293.png)
再次运行
f=open(r'C:\Users\520\PycharmProjects\pythonProject1\mysql\student.csv')
print(f.read())
f.close()
![](https://img-blog.csdnimg.cn/img_convert/c56b6a2b3aec4ddf8b952aa8f9a47484.png)
没有报错,可以
总结
算不算对open函数的偷梁换柱,哈哈哈哈哈哈哈哈。
(因为我大部分文件都是utf-8,要打开的话,不写编码,会报错)。
可惜我并不知道,到底是怎么运行的,因为我确实找不到open函数到底怎么运行的源文件。
(builtins.py,不是这个文件,只有用法)
哎!!!!
学习!!!