0222-0224字符编码与文件处理

0222-0224字符编码与文件处理

1.字符编码

  • 字符编码只跟文本文件和字符串有关,跟音频、视频文件之类的都没有关系。
  • 定义:计算机内部只认识二进制,但是人类语言有各种各样的样式,为了让计算机能够认识人类的语言,内部有一种机制就是将人类语言转为计算机语言。
  • 字符编码:记录了人类语言与数据之间的对应关系

2.字符编码的发展史

  1. 一家独大:美国发明ASCII码表
    • 只有英文字符与数字的对应关系
    • 一个英文字符对应1Byte=8bits,最多包含256哥数字,对应256个字符
    • 0-9 48-57 A-Z 65-90 a-z 97-122,所以小写字母对应的数字一定大于大写字母
  2. 群雄割据
    • 中国发明GBK码:只有中英问字符与数字的对应关系,一个英文字符对应1个字节,一个中文字符对应2个字节
    • 韩国发明Euc-kr表:只有韩英文字符与数字的对应关系
    • 日本发明Shift-JIS表:只有日英字符与数字的对应关系
  3. 一统天下:unicode表(万国码)
    • 存在所有语言中的所有字符与数字的对应关系,即兼容万国字符
    • unicode码只在内存中起作用,使用2个字节类存储一个字符
    • utf-8是unicode的转换格式,一个英文字符占1Bytes,一个中文字符占3Bytes,生僻字更多,只能存储正常的字符,utf8mb4可以存储表情

3.字符编码的应用

  1. 解决乱码问题

    文本文件使用什么字符编码保存,打开的时候就要使用对应的字符编码

  2. python解释器版本不同带来的差异

    • python2 使用的字符编码是ASCII表
    • python3 使用的是utf-8编码
  3. pycharm添加文件模板

    settings-editor-file and code template-python script

  4. 编码与解码[核心]

# 编码:将人类能够读懂的语言转为计算机能够读懂的语言
# 解码:将计算机能够读懂的语言转为人类能够读懂的语言

ss = '你好me'

# 编码
#byte字节
s1 = ss.encode('utf-8')
print(s1,type(s1)) # b'\xe4\xbd\xa0\xe5\xa5\xbdme' <class 'bytes'>

# 解码
print(s1.decode('utf-8')) # 你好me

s = b'kevin123' # 只有英文字符和数字,要想解码的话,直接使用前缀b
print(s.decode('utf8')) #

4.文件介绍

  • 文件的类型:txt word excel py,是python操作文件

  • 三步骤[open]​:1.打开文件 2.操作文件 3.关闭文件

    # 1.打开文件
    open('文件路径','读写模式','字符编码')
    
    f = open('a.txt', 'r', encoding='utf-8')
    print(f) # <_io.TextIOWrapper name='a.txt' mode='r' encoding='utf8'>  文件句柄
    # 2.操作文件
    print(f.read())
    # 3.关闭文件
    f.close()
    # r的作用:当路径中可能存在有转义的字符时,字符串嵌满加上r来解决转义的问题
    r'D:\python25\day09\a.txt'
    

5.文件的读写模式

  1. r >>> read:只读不写

  2. w >>> write:只写不读

  3. a >>> append:追加

    # 1.r 路径不存在,直接报错
    # 2.w 如果路径不存在,会新建一个文件夹;会先清空文件中的内容再进行写内容
    # 3.a 如果路径不存在,会新建一个文件夹;指挥在文件末尾追加内容
    

6.文件的操作方法

# 1.读系列
f.read()     # 一次性读取文件内所有数据,存在漏洞,内容过大会内存外溢
f.readline() # 一次读取一行
f.readlines() # 把文件内的一行一行数据组装成列表元素返回,注意末尾的换行符
f.readable() # 返回布尔值,是否可读

# 2.写系列
f.write()
f.writelines() #用列表写,一般不用,麻烦
f.writable() # 返回布尔值,是否可写

7.文件读操作优化

with open('a.txt', 'r', encoding='utf-8') as f:
    print(f.read())

    '''文件句柄f支持for循环'''
    for line in f:
    print(line)  # 一次代码一行数据
    '''以后读取文件数据时,都用for循环一行一行读取,不会出现内存溢出'''
with open('a.txt', 'w', encoding='utf-8') as f:
     f.write('hello')
     f.flush() # 把内存中得数据立刻刷到硬盘中

8.文件的操作模式

  1. r w a模式

    """
    		1. 只能操作文本文件
    		2. 都是以字符为单位
    		3. rt wt at  => t可以省略
    		4. encoding参数必须写
    	"""
    
  2. b模式:二进制

    """
           1.能够操作任意的数据类型,eg:文本、视频、音频
           2.以字节为单位
           3.rb ab wb >>>:b不可以省略
           4.encoding参数不写
    """
    with open('b.txt','wb') as f:
        s = '你好'
        f.write(s.encode('utf-8'))
        
    with open('b.txt','rb') as f:
        print(f.read().decode('utf-8'))
    

9.文件二进制读操作

with open('b.txt','rb') as f:
    print(f.read(3).decode('utf-8'))
    
'''
1.r模式 
	read()里面的数字代表的是一个字符
2.b模式
	read()里面的数字代表的是一个字节
'''

10.文件的移动指针[了解]

with open('b.txt','rb') as f:
    print(f.read(12).decode('utf-8'))
    f.seek(3,0) # 控制指针的移动
    f.seek(3,1) # 控制指针的移动
    f.seek(3,2) # 控制指针的移动
    print(f.read(),decode('utf-8'))
'''
f.seek总共有3种模式
	1.offset参数
		偏移量,移动的位置
		如果是正数,从左往右读取
		如果是负数,从右往左读取
	2.whence参数
		0:默认的模式,该模式代表指针移动的字节数是以文件开头为参照的
		1:该模式代表指针移动的字节数是以当前所在的位置为参照的
		2:该模式代表指针移动的字节数是以文件末尾的位置为参照的
    '''
# 小练习:实现动态查看最新一条日志的效果
import time
with open('access.log',mode='rb') as f:
    f.seek(0,2)
    while True:
        line=f.readline()
        if len(line) == 0:
            # 没有内容
            time.sleep(0.5)
        else:
            print(line.decode('utf-8'),end='')

11.文件的修改[了解]

# 方式一:先将文件内容一次性读入内存,然后使用字符串内置方法替换数据,最后把替换之后的数据写入文件
# 1. 读取b.txt文件数据
with open('b.txt', 'r', encoding='utf-8') as f:
    data = f.read()
print(data)  # kevin kevin kevin kevin say hello world
new_data = data.replace('kevin', 'jack')

# 2. 把新的数据再次写入文件
with open('b.txt', 'w', encoding='utf-8') as  f1:
    f1.write(new_data)
    
    
# 方式二:以读的方式打开源文件,以写的方式打开一个临时文件,一行行读取源文件内容,修改完后写入临时文件,删除源文件,将临时文件重命名为源文件名
import os

with open('a.txt','rt',encoding='utf-8') as read_f:
    with open('b.txt',mode='wt',encoding='utf-8') as wrife_f:
        for line in read_f:
            wrife_f.write(line.replace('SB','kevin'))

os.remove('a.txt')  # 删除源文件
os.rename('b.txt','a.txt')
posted @ 2023-03-02 21:23  雀雀飞了  阅读(101)  评论(0编辑  收藏  举报