据说Python的文件操做很容易在某一些电脑上出问题,然而罪魁祸首就是字符编码。让咱们来了解一些底层的编码方式。html
目前全部的文章思想格式都是:知识+情感。 知识:对于全部的知识点的描述。力求不含任何的自我感情色彩。 情感:用我本身的方式,解读知识点。力求通俗易懂,完美透析知识。
本文主要分为两大部分,一部分是如何使用Python进行文件操做,另外一部分是聊一下字符编码的那些事。(比较绕,尽可能用最最最通俗的话表述~~)python
1.文件操做方式
open()
close()
直接看源码吧~~网络
def open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True): """ Open file and return a stream. Raise OSError upon failure. ========= =============================================================== Character Meaning --------- --------------------------------------------------------------- 'r' open for reading (default) 'w' open for writing, truncating the file first 'x' create a new file and open it for writing 'a' open for writing, appending to the end of the file if it exists 'b' binary mode 't' text mode (default) '+' open a disk file for updating (reading and writing) 'U' universal newline mode (deprecated) ========= =============================================================== """ pass
2.文件操做modeapp
'r' 只读 'w' 清空文件内容,只写 'a' 打开文件,追加内容 'b' 二进制操做文件,因此就有rb/wb/ab '+' 增长读写的功能,plus的功能~,因此就有w+/r+
3.读文件
1)最经常使用的是使用with 语句打开文件,不须要考虑关闭文件,自动进行文件的关闭
2)使用文件句柄f进行打开文件,必须本身指定关闭文件
3)文件读取的时候,可使用 read() 读取全部的文件,也可使用readline() 读取文件的一行
4)注意原始文件的编码,不指定pycharm默认的是utf-8,编码错误就乱码函数
4.写文件
1)写数据到文件,使用 write()函数,可是不是直接写到硬盘中,是先写到内存中,过必定时间以后写到硬盘中。
2)可使用 flush() (强刷内存中数据到硬盘)学习
5.文件的经常使用操做
关键点:文件中光标的位置编码
seek() # (注意:文件的编码,整数倍的文件编码单元的字节) truncate() # 截断数据 tell() # 返回光标的位置 修改文件局部内容 占内存修改 占硬盘修改
6.附加了解内容
1)给文件重命名
可使用 : os.rename() 或者 os.replace()
注意:在使用with打开文件重命名的时候,会报错,缘由是当前文件尚未被关闭,是没有办法重命名的,能够更换打开方式,使用文件句柄打开。操作系统
2)sys.argv
sys.argv[]是从程序外部获取参数
sys.argv[0]表示代码自己文件路径
不理解的能够参考一下 这篇文章;http://www.javashuo.com/article/p-cthlxfyn-n.htmlcode
1.二进制是什么?
二进制是0与1,计算机只认识二进制。可是人并不认识计算机认识的二进制(命令转化的二进制)。人只认知命令。那么命令如何变为二进制就是须要解决的问题。htm
2.ASCII表能够干什么?
ASCII表表示的256个字符的顺序表。既然有顺序,那么人能够读的是十进制,而十进制能够变为二进制,因此ASCII表也就是起到了特殊字符映射到二进制的做用。
Python查看输入字符对应的二进制的十进制数是多少的函数: ord('a')
注意:此时咱们就能够输入ASCII表中的字符,就会转为二进制,计算机就看懂了。见下图ASCII表:
3.数据的表示
在计算机中,规定一个二进制数为一个bit(位)。
八个二进制数为八个bit,称为1个bytes,表示1个字节。
进而:1KB=1024B
在基础知识,已经知道了ASCII表是作什么的,那么如今能够表示ASCII表中的字符到计算机中了,此时其余除了ASCII表中的字符去哪里找,有怎么存储到计算机中?
中国,最早使用的是 GB2312,随着须要表示字符数量的增多,开始使用GBK。此时就能够将汉字转换为计算机能够看懂的二进制数。
注意: GBK是在ASCII表中的进行的字符映射扩展。此时表示一个汉字须要2个字节。
unicode编码,是将全球的语言字符进行了整合,全部的语言字符均可以在unicode中找到。
注意:unicode编码的全部字符所有须要4个字节。
utf家族的表明明星是: utf-8。
因为使用unicode编码,文件的存储变大,而且不利于网络数据的传输和存储,因此改进的方式是utf家族,其中使用对多的就是utf-8.
UTF-8: 使用一、二、三、4个字节表示全部字符;优先使用1个字符、没法知足则使增长一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚(中国)占3个,其它及特殊字符占4个
1.前提知识:
1)计算机的内存中数据,也就是内存中的二进制0和1,是使用 unicode 编码。
2)全部的网络传输与数据存储(硬盘上的数据),是使用utf-8 编码。
3)Windows系统的编码是 gbk。
2.不一样编码转换方法
使用unicode编码做为中介,首先将源编码文件进行解码(decode()解码)成为unicode,再将unicode编码(encode())成为目标编码格式。
3.pycharm中声明编码格式
推荐声明:coding:utf-8 # -- encoding:utf-8 --
注意:第一行写编码声明,此时pycharm会自动将该文件的编码格式变为utf-8.本身留意书写与不写声明,pycharm右下角的变化。
小结一下,文件操做中,使用with语句打开的时候,若是对文件继续操做,不手动关闭,会报错。(本身踩得大坑,with语句不会在跳出with以后自动关闭,有必定的时延)
字符编码,真心很差理解,其实最简单的方式就是,分开看内存,硬盘,操做系统,软件,以及对应的编码是什么,就会很清楚了,祝你们学习愉快~~
一点感悟:时间很快,就是转眼间的事,尽可能将本身的时间进行量化~~~