字符编码及文件操作

mac2022-06-30  64

一、字符编

1.什么是字符编码:将人能识别的字符转换为计算机能识别的01二进制的过程就是字符编码,转换的规则就是字符编码表2.常用的编码表:ASCII、GBK、Unicode、UTF-8    了解:编码表的发展史    1. ascii(ASCII):字母、数字、英文符号与计算机01标识符的对应关系     思考:如何将128个字符用01完全标签     二进制:11111111 => 255 => 1bytes(1字节) => 8个二进制位    2.中国:研究汉字与计算机01标识符的对应关系:gb2312 => GBK(***) => GB18030     日本:Shift_JIS     韩国:Euc-kr     3.万国码unicode    优点:统一用2Bytes表示所有的字符(任何国家都能使用)    例: a 0000 0000 0010 1010    缺点:    1.浪费存储空间    2.io次数增加,程序运行效率降低(致命)     现在的计算机     内存都是unicode     硬盘都是utf-8    (需要掌握的)     unicode的两个特点     1.兼容万国字符     2.其他国家编码的数据由硬盘读到内存的时候unicode与其他各个国家的编码都有对应关系    (必须掌握的)    数据由内存保存到硬盘     1.内存中的Unicode二进制数字 >>>编码(encode)>>> utf-8格式的二进制数据    硬盘中的数据由硬盘读到内存     1.硬盘中的utf-8格式的二进制数据 >>>解码(decode)>>> 内存中unicode格式的二进制数据    python2    (将py文件按照文本文件读入解释器)默认使用ASCII码(因为再开发python2解释器的时候 unicode还没有盛行)    python3    (将py文件按照文本文件读入解释器)默认使用utf-8     # 思考:unicode与utf-8什么关系    unicode:用2个字节来存储汉字,用2个字节来存储英文字母,占有空间较多,读取效率极高    utf-8:用3-6个字节来存储汉字,用1个字节来存储英文字母,占有空间较少,读取效率低    总结:内存都是按unicode存储数据,硬盘和cpu采用utf-8来存取数据    #“abc你好”    unicode与utf-8采用的是一张unicode编码表,utf-8是unicode编码表体现方式,变长存储数据。    变长优点:(大量数据都是以英文存在,所以utf-8空间更小)传输速度更快3.编码操作:编码encode()、解码decode()    s = '123呵呵'    n_b = bytes(s, encoding='utf-8')    print(n_b)    b = b'123\xe5\x91\xb5\xe5\x91\xb5'    n_s = str(b, encoding='GBK')    print(n_s)    在清楚原格式是字符串还是二进制时:    # 将u字符串编码成b字符串    print(u'你好'.encode('utf-8'))    # 将b字符串解码成u字符串    print(b'\xe4\xbd\xa0\xe5\xa5\xbd'.decode('utf-8'))     文件头:    # coding:utf-8    1.因为所有的编码都支持英文字符,所以文件头才能够正常生效    python2存数据的时候可以    x = u'上' # 前面加个u 就以unicode格式存数据    print type(x)    print x    基于python2解释器开发的软件,只要是中文,前面都需要加一个u    为了的就是将python2(当你不指定文件头的时候,默认用ASCII存储数据,如果指定文件头那么就按照文件头指定的格式存储)    python3中字符串默认就是unicode格式的二进制数    补充:    1.pycharm终端用的是utf-8格式    2.windows终端用的是gbk     乱码:字符不能够正常显示 编码不一致    (******)    保证不乱码的关键:     文本文件以什么编码编的就以什么编码解码     八位二进制也叫8bit    8bit = 1Bytes    1024Bytes = 1KB    1024KB = 1MB    1024MB = 1GB    1024GB = 1TB    1024TB = 1PB

二、文件操作

1.什么是文件? 操作系统提供给用户操作复杂硬件(硬盘)的简易接口2.为什么要操作文件? 人或者应用程序需要永久的保存数据3.如何用? 通过python代码操作文件 r 取消转义 f.open   r'D:\day 06\db.txt',encoding='utf-8'  文件打开的模式   r 只读模式   w 只写模式   a 追加模式  操作文件单位的方式   t 文本文件 t在使用的时候需要指定encoding参数 如果不指定 默认是操作系统的默认编码   b 二进制操作 一定不能指定encoding参数   1.应用程序要想操作计算机硬件 必须通过操作系统来简介的操作     f = open(r'D:\day 06\db.txt',encoding='utf-8') # 向操作系统发送请求 打开某个文件     print(f) # f是文件对象     print(f.read()) # windows 操作系统默认的编码是gbk     f.read() # 想操作系统发请求 读取文件内容     f.close() # 告诉操作系统关闭打开的文件     print(f.read())   2.文件上下文操作     with open(r'D:\day 06\db.txt',encoding='utf-8') as f: # f仅仅是一个变量名     print(f)     print(f.read())     mode 参数可以不写 不写的话默认是rt 只读文本文件 这个t不写默认就是t     with open(r'D:\day 06\db.txt', mode='r' ,encoding='utf-8') as f:     print(f.readable()) # 是否可读     print(f.writable()) # 是否可写     print(f.read()) # 一次性将文件内容全部都出     with open(r'D:\day 06\1.jpg', mode='rb') as f:     print(f.readable()) # 是否可读     print(f.writable()) # 是否可写     print(f.read()) # 一次性将文件内容全部都出     3.r模式再打开文件的时候 如果文件不在 直接报错(*****)    文件路劲可以写相对路径 需要注意该文件必须与执行文件在同一层文件下     with open(r'db.txt', 'r' ,encoding='utf-8') as f:     print(f.readable()) # 是否可读     print(f.writable()) # 是否可写     print('>>>>>:1')     print(f.read()) # 一次性将文件内容全部都出     print('>>>>>:2')     print(f.read()) # 读完一次之后 文件的光标已经再文件末尾了,再读就没有内容可读了     print(f.readlines()) # 返回的是一个列表 列表中的一个个元素对应的就是文本中一行行的内容     for i in f:     print(f)     print(f.readline()) # 只读取文件一行     print(f.readline())     print(f.readline())     print(f.readline())     4.w模式:一定要慎用       1.文件不存在的情况下,自动创建该文件       2.当文件存在的情况下 先会清空文件内容再写入     with open(r'jason.txt', 'w' ,encoding='utf-8') as f:     print(f.readable()) # 是否可读     print(f.writable()) # 是否可写     print(f.write('鸡哥张江第一大帅逼\n'))     print(f.write('鸡哥虹桥第一大帅逼\n'))     print(f.write('鸡哥上海第一大帅逼\n'))     l = ['鸡哥张江第er大帅逼\n','鸡哥虹桥第一大帅逼\n','鸡哥上海第一大帅逼\n']     print(f.writelines(l))     5.a模式       1.文件不存在的情况下,自动创建该文件       2.当文件存在的情况下 不清空文件内容,文件的光标会移动到文件末尾     with open(r'jason.txt', 'a' ,encoding='utf-8') as f:      print(f.readable()) # 是否可读     print(f.writable()) # 是否可写     f.write('鸡哥说:我是大帅逼\n')

 

  4.游标

    1. 如何使用游标:游标的相关方法    2. 游标相关的读写操作    3. 根据游标在大文件中取出多个指定位置的部分字节内容    seek(偏移量, 偏移位置)    偏移量以字节为单位    偏移位置:    0 -- 文件开头    1 -- 当前位置    2 -- 文件末尾 在rt模式下 read内的数字 表示的是字符的个数 初次之外,数字表示的都是字节 with open(r'test','r',encoding='utf-8') as f: print(f.read(5)) with open(r'test','rb') as f: res = f.read(10) # 读的是三个字节bytes print(res) print(res.decode('utf-8')) 文件内光标的移动 """ f.seek(offset,whence) offset:相对偏移量 光标移动的位数 whence: 0:参照文件的开头 t和b都可以使用 1:参照光标所在的当前位置 只能在b模式下用 2:参照文件的末尾 只能在b模式下使用 """ with open(r'test','rt',encoding='utf-8') as f: print(f.read(1)) # f.seek(6,0) # seek移动都是字节数 # f.seek(4,0) # seek移动都是字节数 # print(f.read(1)) f.seek(0,0) print(f.read(1)) f.seek(0, 0) print(f.read(1)) f.seek(6,0) print(f.read()) with open(r'test','rb') as f: print(f.read(3).decode('utf-8')) f.seek(0,0) print(f.read(3).decode('utf-8')) f.seek(7,0) print(f.read(1).decode('utf-8')) # f.seek(6,0) # seek移动都是字节数 # f.seek(4,0) # seek移动都是字节数 with open(r'test','rb') as f: print(f.read(3).decode('utf-8')) f.seek(3,1) print(f.read(1)) f.seek(6,0) # seek移动都是字节数 f.seek(4,0) # seek移动都是字节数 with open(r'test','rb') as f: print(f.read()) f.seek(-4,2) print(f.read().decode('utf-8')) with open(r'test','r+',encoding='utf-8') as f: f.seek(3,0) f.write('') View Code  

   5.其他模式补充

    r+/w+/a+  

with open(r'test',mode='r+',encoding='utf-8') as f: print(f.readable()) print(f.writable()) print(f.readline()) f.write('嘿嘿嘿') with open(r'test',mode='w+',encoding='utf-8') as f: print(f.readable()) print(f.writable()) print(f.readline()) f.write('嘿嘿嘿') with open(r'test',mode='r+b') as f: print(f.readable()) print(f.writable()) res = f.read() # print(res.decode('utf-8')) res1 = str(res,encoding='utf-8') print(res1)

  6.截断文件

截断前: with open(r'test','a',encoding='utf-8') as f: f.truncate(6) # 接收的字节的长度 整型 # 保留0~6字节数 后面的全部删除(截断)截断后:

错误案例:

with open(r'test','a',encoding='utf-8') as f: f.truncate(4) # 每个汉字所占字节数为3位 如果不是3的倍数 则会出现乱码

 

 

  7.修改文件

''' 优点:任意时间硬盘上只有一个文件 不会占用过多硬盘空间 缺点:当文件过大的情况下 可能会造成内存溢出 ''' # 修改文件方式1: with open(r'test','r',encoding='utf-8') as f: data = f.read() with open(r'test','w',encoding='utf-8') as f: res = data.replace('jason','egon') f.write(res) ''' 优点:任意时间硬盘上只有一个文件 不会占用过多硬盘空间 缺点:当文件过大的情况下 可能会造成内存溢出 ''' # 修改文件方式2: import os with open(r'test','r',encoding='utf-8') as read_f,\ open(r'base','w',encoding='utf-8') as write_f: for line in read_f: new_line = line.replace('egon','tank') write_f.write(new_line) os.remove(r'test') os.rename('base','test') ''' 优点:内存中始终只有一行内存 不占内存 缺点:在某一时刻硬盘上会同时存在两个文件 '''

 

转载于:https://www.cnblogs.com/linxidong/p/11139604.html

最新回复(0)