Day 07 Day08 字符编码与文件处理
1.字符编码: 只针对文字 ***
1.字符编码表发展史: ASCII 码表 >>>> 各国自己语言的字符编码表>>>>万国码(unicode)
2: ASCII表:用8个比特位表示(1个字节)一个英文字符。
3:gbk: 用2个字节来表示一个中文字符,还是用一个bytes 表示一个英文字符
4:unicode: 统一用2个字节表示所有字符,兼容各国编码
特点:(1)用户在输入时无论输入什么字符都兼容万国字符
(2)其他国家编码的数据由硬盘读取到内存的时候unicode与其他各个国家的编码都有对应关系
缺点: (1)浪费存储空间
(2)io次数增加,程序运行速度降低(致命)
5:重点:
1:现在计算机内存都是unicode,硬盘是utf-8,当内存中的unicode格式编码的数据存到硬盘是,会将Unicode转换位utf-8编码格式来保存,其中中文字符为3个字节,英文字符为1个字节
2:过程:
1 数据由内存保存到硬盘
内存中的Unicode格式的二进制数据 >>> 编码(encode)>>>> utf-8格式的二进制数据
2 数据又硬盘读取到内存:
硬盘中的utf-8格式的二进制数据 >>> 解码(decode) >>> Unicode格式的二进制数据
6 :编码, 解码:
1. 保证不乱吗就在于文件以什么编码形式保存。就以什么编码形式打开 (以什么编码编就以是什么编码解)
2. 在python2中,将py文件读到解释器时默认用的是ASCII码,在python3中。默认的是utf-8码
7 :文件头:
# coding:utf-8
1.因为所有的编码都支持英文字符,所以文件头才能够正常生效
2.基于Python解释器开发的软件,只要是中文,前面都需要加一个为了在python2当不指定文件头的时候,默认用ASCII存储数据,如果指定文件头那么就按照文件头的编码格式存储数据)
3.python3中字符串默认就是unicode编码格式的二进制数
8:注意:pycharm终端用的是utf-8格式,在windows终端用的是‘gbk'
9:字节等关系:
1B = 8Bytes
1kb = 1024b
1Mb = 1024 kb
1GB = 1024 MB
1TB = 1024 GB
1PB = 1024 TB
2.文件处理:
1.什么是文件:系统暴露给用户操作复杂硬件的简易接口
2.为什么操作文件:人或者应用程序需要永久的保留数据
3.通过Python代码来操作文件: 操作完必须关闭文件。close()
f = open(r'D:\学习资料\day08\代码\day08\test', mode='r', encoding='utf-8') print(f.read()) f.close() ''' 通过python代码来操作文件 1.open() : 打开文件 2.r' 取消转义 3.'D:\学习资料\day08\代码\day08\test' 文件的绝对路径 (可以写文件的相对路径) 相对路径:必须有一个参照物 通常是相对于执行文件所在的文件夹 绝对路径:类似与GPS定位,文件所在的详细路径 4.mode 操作文件的方式。可省略不写,默认以’r'读的方式打开 5.encoding=‘utf-8' : 操作文件的编码方式 6. f 变量名 一个对象 文件句柄 7. f.read() :将文件一次性都出来读取出来,如果文件过大会导致内存溢出 8. f.close() :告诉操作系统关闭打开的文件 '''
4. 文件上下文管理:操作完自动关闭打开的文件
with open(r'D:\学习资料\day08\代码\day08\test',mode='r',encoding='utf-8') as f: print(f.read())
5.文件的打开方式:(mode 参数)
6:操作文件单位的方式:
t : 文本文件。在使用的时候需要指定encoding参数,若不指定则以系统默认编码方式打开
b : 二进制文件。 在使用时候哟东不能指定encoding参数,通常用于打开视频音频等文件,或者用与传输文件
7:只读:(r)文件不存在的情况下 直接报错,文件存在的情况下 光标在文件开头
with open(r'D:\学习资料\day08\代码\day08\test',mode='r',encoding='utf-8') as f: print(f.readable()) # True 是否可读 print(f.writable()) # False 是否可写 print(f.read()) # ahjkjh\n 哈佛看 \n 围殴日哦 \n 啊JFK蓝 将文件一次读出 print(f.read()) # 没有内容 因为当文件读取完国标移动到末尾 f.seek(0, 0) # 将鼠标移动到开始 print(f.readline()) # ahjkjh 一行一行的读取文件 print(f.readline()) # 哈佛看 f.seek(0, 0) # 将鼠标移动到开始 print(f.readlines()) # ['ahjkjh\n', '哈佛看\n', '围殴日哦\n', '啊JFK蓝'] 返回的是一个列表,将文件中的一行行内容作为元素添加到列表中
with open(r'D:\学习资料\day08\代码\day08\test', mode='r', encoding='utf-8') as f: for line in f: # f 可以被for循环,每次读取一行内容 print(line) # 可以解决读取大文件的问题,内存始终只有一行内容
8:只写:(w)文件不存在的情况下 自动创建新文件,文件存在的情况下 先清空文件内容再执行写入
with open(r'D:\学习资料\day08\代码\day08\test', mode='w', encoding='utf-8') as f: f.write('hello')
9. 只追加:(a)文件不存在的情况下 自动创建新文件,文件存在的情况下,不清空内容。光标移动到末尾
with open(r'D:\学习资料\day08\代码\day08\test', mode='a', encoding='utf-8') as f: f.write('你好') # 末尾追加
10.光标:(seek)
1.在rt模式下 read内的数字 表示的是字符的个数
2.除此之外,数字表示的都是字节
3.f.seek(offset,whence)
offset:相对偏移量 光标移动的位
whence:
0:参照文件的开头 t和b都可以使用
1:参照光标所在的当前位置 只能在b模式下用
2:参照文件的末尾 只能在b模式下使用
11.截取片段
with open(r'test', 'a', encoding='utf-8') as f: f.truncate(6) # 接收的字节的长度 整型 # 保留0~6字节数 后面的全部删除(截断)
12. 监测文件内容
with open(r'test01.txt', 'rb') as f: # 先将光标移动到文件末尾 f.seek(0, 2) while True: res = f.readline() if res: print("新增的文件内容:%s" % res.decode('utf-8')) # 说明有人操作当前文件
13.修改文件:
1:
# 将数据读取到内存中 # 在内存中修改 # 覆盖原文件 with open(r'D:\学习资料\day08\代码\day08\res', 'r', encoding='utf-8') as f: content = f.read() with open(r'D:\学习资料\day08\代码\day08\res', 'w', encoding='utf-8') as f1: new_content = content.replace('小明', '小红') f1.write(new_content)
2:
# 创建一个新文件 # 将源文件循环修改然后写到新文件中 # 删除原文件,将新文件命名成原文件名 import os with open(r'D:\学习资料\day08\代码\day08\res', 'r', encoding='utf-8') as f, \ open(r'D:\学习资料\day08\代码\day08\res.bar', 'a', encoding='utf-8') as f1: for line in f: f1.write(line.replace('小红', '小明')) os.remove(r'D:\学习资料\day08\代码\day08\res') # 删除原文件 os.rename(r'D:\学习资料\day08\代码\day08\res.bar', r'D:\学习资料\day08\代码\day08\res') # 重命名文件