Python学习day10-文件处理
字符编码
我们都知道,计算机只认识0和1的二进制数字,所以简单来说,字符编码就是使二进制和软件所能识别的字符之间相互转化的一个过程。
从字符编码的发展历史来看,最早出现的ASCII,即是从二进制到英文字符之间的相互转化,直到现在仍在继续运用,然后到各国自己开发的各种字符编码,像我大中华开发的gb2312
编码,日本人的Shift_JIS
编码以及韩国人的Euc-kr
编码,都是只能识别本国的语言,不能兼容其他国家的语言。直到后来出现了一种能识别万国语言的编码,叫做Unicode
,是世界的标准,从此之后乱码的问题基本不会出现了。
当然Unicode
也是有缺点的,就是同样的数据来说,Unicode
占用的空间会更大,会造成计算机空间的浪费,在传输和存储上都有着很大的弊端。
于是,世界上最牛逼的编码出现了,UTF-8
,也被称为可变长编码,完美适用于所有情况。可是实际情况是,现在并不是所有的地方都在使用UTF-8
。其原因还是个历史遗留问题,也就是现在几乎所有的计算机内存中存在的都是Unicode
代码,而各个国家的代码也都要继续运行中,所以不能一次性全部换成UTF-8
,必须使用Unicode
。还有一个原因就是Unicode
可以识别玩过语言,但是UTF-8
目前还不能,但是随着时代的更替,所有内存中的代码都将变为UTF-8
格式,到时UTF-8
编码也将彻底取代Unicode
编码。
总的来说,不想出现乱码的方法就是,字符按照什么标准编码的,就要按什么标准解码,也就是字符编码,只要编码解码的字符编码是相同的,文件就不会出现乱码。
python2和3编码的区别
python程序运行的大致流程
首先我们应该明白python程序运行的大致流程,基本可以分为三步:
- 启动Python解释器(对于计算机来说相当于文件编辑器)
- 打开文件,从硬盘将文件读入内存,显示输入的字符并检查语法是否有错误(设计字符编码)
- 点击运行,执行刚刚从硬盘中获取的内容,并且解释字符(设计字符编码,再去内存中)
-
而python2和3 的主要区别就是在第三步中,具体在于:
python3中用的编码字符是UTF-8,而python2中用的编码字符是Unicode加上文件头部指定的coding编码。
我们都知道终端会有自己的默认编码,比如
pycharm
的默认编码是UTF-8所以这就导致了在python3中:
- 假设终端的默认编码是GBK,可以识别GBK编码的变量
- 但如果终端的默认编码是UTF-8,可以识别GBK编码的变量
而在python2中:
- 假设终端的默认编码是GBK,可以识别GBK编码的变量
- 但如果终端的默认编码是UTF-8,就不能识别GBK编码的变量
文件的三种打开方式
python中对文件的打开有三种基础模式(默认为r模式):
x
f = open('file_name',mode,encoding = 'utf8')
-
r为read,只读模式
-
xxxxxxxxxx
11f = open('file_name','r',encoding = 'utf8')
2data = f.read()
3print()
-
w为write,只写模式(清除后写入)
-
xxxxxxxxxx
11f = open('file_name','w',encoding = 'utf8')
2data = f.write()
-
-
a为append,追加模式(直接追加,不在原数据上修改)
-
xxxxxxxxxx
11f = open('file_name','a',encoding = 'utf8')
2data = f.write()
-
文件读写的格式有两种(默认为b模式):
-
t为text,也就是文本读写
-
b为bytes,以二进制方式读写
要注意,读写的格式要和读或者写组合才可以使用,比如
rt,rb,wt,wb
等等,不能单独使用,而且读和写不能同时使用。
with管理文件操作上下文
with模式相对于直接open赋值的话优点在于不用手动关闭文件,前文我们讲过,
xxxxxxxxxx
f = open('file_name',mode,encoding = 'utf8')
# 在结尾要加
f.close()
# 不然不能结束文件的打开
而with打开文件则不用,使用方法如下:
x
with open('file_name','r',encoding = 'utf8')as fr:
data = fr.read()
#with还有一个优点就是with可以同时打开多个文件,中间以逗号间隔,方便文件之间的操作
with open('file_name','r',encoding = 'utf8')as fr,open('file_name1','w',encoding = 'utf8')as fw,open('file_name3','a',encoding = 'utf8')as fa:
data1 = fr.read()
data2 = fw.write()
data3 = fa.write()
Tips:
今天说一些对学习python的一些看法,今天已经是学习python第十天了,虽然做的项目不多,但是真切感受到python写出来的程序执行效率确实不太高,从写`leetcode
的算法题可以看出来,执行时间普遍都比较长,很容易就超过时间限制了。
但是python写代码的速度是真的快,各种模块,各种内置方法,基本自己能想到的一些想法,都可以通过很简单的途径出现,而不像编译型语言一样,很简单的功能都需要自己写很长,然后封装成接口使用,这一点确实优点很大。
继续努力,每一种编程语言,但凡火起来,总会有其原因,加油。