三.字符编码与文件操作

一.字符编码:

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'xe4xb8xadxe5x9bxbd'
中国

**.编码需要注意的一点就是,用什么编码表编码的就用什么编码变解码,在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是一个生成器,它会每次遇到一个 就将一行内容赋值给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模式:写模式 写入文件内容,文件不存在则报错,指针直接跳到文件开头 要加
文件不存在的时候回创建空文档,文件存在时会清空文件
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()查看文件指针距离当前文件开头的位置

原文地址:https://www.cnblogs.com/njzy-yuan/p/10599991.html