三.字符编码与文件操作
一.字符编码:
http://www.cnblogs.com/leesf456/p/5317574.html 参考
字符编码与二进制:
计算机底层是二进制,输出中文时,是通过ascii码编译成中英文,
ASCII码表(美国标准信息交换代码):最多有2*8个字符,256个。
65-90位26个为大写字母,97-122为小写字母。
GB2312表:占用72*94的码位。6000多个汉字→→ GBK1.0 :收录了2万多个汉字 →→
GB18030 :收录了27000多个汉字。 中文为2个字节
发展历程:
ASCII 256个字符 →→ GB2312(1980,6700多个汉字)→→GBK(1995,21000)→→GB18030(2000,27000)
Unicode(万国码):支持所有文字
占用空间对比:
ASCII:
二进制位=bit = 8bits = 1bytes
1024 bytes = 1 kb
1024 kb = 1 MB
ASCII 256, 由于每个ASCII字符都占8位,所以二进制位是用8位,一个字节为8位。
一个二进制位是计算机里的最小表示单元
一个字节是计算机最小的存储单位
Unicode:一个字符两个字节,一个英文两个字节
utf-32 = 32位 = 4字节
utf-16 = 16位 = 2字节
utf-8 = 8位 = 1字节 可变长编码 :英文一个字节,中文三个字节
单行注释: #
多行注释:``` ``` 不可以执行,可以被打印
在python2中与python3中字符编码的区别:
1.在python2中,
str:bytes数据
unicod:unicode编码后的数据
2.pyhton3中
str:unicode编码后的数据
bytes:bytes数据
bytes:字节类型(二进制类型),所有的字符要存到内存里,硬盘里,都是bytes格式
在python2里,看到字符串,就是bytes
在python3里,看到的字符串,是str,
在python3里面,内存里面全是unicode,而文件的默认编码方式是utf-8
由于python3内存里面全是unicode,字符串在pyhton3里面也是unicode类型,所有不需要再进行解码,直接编码就行。
而在python3里面看到bytes,直接encode就是看到bytes.
编码的encode(),decode()的用法。
s = '中国' print(type(s)) print(type(bytes(s,encoding='utf-8'))) b = s.encode(encoding='utf-8') print(b) print(b.decode(encoding='utf-8'))
----------------------------- 运行结果
<class 'str'>
<class 'bytes'>
b'\xe4\xb8\xad\xe5\x9b\xbd'
中国
**.编码需要注意的一点就是,用什么编码表编码的就用什么编码变解码,在python3中,一般在文件开头声明给解释器去用utf-8编码格式去解释下面文件内容。
coding:utf-8
二.文件的处理:可参考:https://blog.csdn.net/m0_38059843/article/details/78240835
1.文件操作的三个步骤:
1>打开文件:f = open('file_path',mode='',encoding='')
打开文件的过程是通过内置函数open()得到一个文本i/o的流,Txtiostream ,也可以说成是文件句柄,实际上是一个生成器,具有生成器性质与特征。
从硬件上去看文件的打开操作:当我们打开一个文件的时间,应用程序会向操作系统发送一个请求打开文件的指令,操作系统就会从硬盘中拿到这个文件的引用,然后交给应用程序使用,所有当我们进行文件处理的时候,要在最后进行文件关闭的操作。
2>文件操作:
通过打开文件,获得一个文件流,也就是文件句柄,直接调用f的方法就能对文件进行操作。
1.f.read() :一次性读取文件的全部内容,f.read(file_size) file_size 可以确定一次读取文件内容的大小,是以字符单位读取文件内容的。
2.f.readline():每次读取文件的一行内容。
3.f.readlines():一次性读取文件的全部的行内容。
如何得到文件的每一行内容:
for line in f: f是一个生成器,它会每次遇到一个\n就将一行内容赋值给line,从而循环读取文件的每一行。
3>.文件关闭:f.close()
3.文件的操作模式:(mode)
1.纯净模式:r,w,a
r:只能进行读取文件操作
w:只能进行文件写的操作
a:在文件末尾进行写的操作
2.t模式:文本模式
1>.读写是以字符串为单位的模式,
2>.只能针对文本文件,无论是在读过程中只能针对文本文件,无论是在读过程中,还是写过程中会自动将字符串转换成二进制,是因为默认指定的编码方式为utf-8
3.b模式:二进制模式 读写操作是以二进制位单位的模式,不需要指明encoding的编码方式t,b模式不能单独使用,必须和纯净模式联合使用,如rt,rb,wt,wb
文件复制: with open('file',mode='rb') as f_read: data = f_read.read() with open('file',mode='wb') as f_write: f_write.write(data)
这样可以进行文件复制,但当文件过大时会出现内存爆掉的可能,所以用以下方式更好:
with open('file',mode='rb') as f_read,open('file',mode='wb') as f_write: for line in f_read: f_write.write(line)
文件模式详解:
1.r模式:只读模式,打开文件,文件不存在报错,指针直接跳到文件开头位置
2.w模式:写模式 写入文件内容,文件不存在则报错,指针直接跳到文件开头 要加\n
文件不存在的时候回创建空文档,文件存在时会清空文件
3.a模式:追加模式,文件不存在时候新建空文档,文件存在的情况下会将指针移动到文件末尾。
2.操作文件的方法:r+,w+,a+
3.文件指针的移动:f.seek()
4.文件修改的两种方式:
flush():将文件的内容立即刷到硬盘,在文件写入大量数据时,及时释放内存空间,否则会出现内存溢出,数据丢失,会将文件内容立即刷到硬盘
writelines():
6.文件内指针的移动
##大前提:文件内指针的移动是以Bytes为单位的,唯独t模式下的read模式读取文件是以字符串为单位的
1. f.seek(指针移动的字节数,模式控制)=控制文件指针的移动
模式控制:
0:默认模式,该模式代表指针移动的字节数是以文件开头为参照的
1:该模式代表指针的字节数是以当前文件所在的位置为参照
2:该模式代表的指针的字节数是以当前文件末尾的位置为参照
##强调:其中0模式可以在t或者b模式使用,而1,2模式只能在b模式下用,在2模式下,f.seek(0,2)特殊可以在t模式下使用
2. f.tell()查看文件指针距离当前文件开头的位置