day02 文件
一,字符编码表
就是字符与机器语言一一对应关系的一个总结表
二,字符编码发展历史
- 第一阶段,只能识别英语,ASCII表
- 第二阶段,各个国家发展自己的编码表
- 中国,gbk
- 日本,Shift_JIS
- 第三阶段,统一阶段,unicode,进行了统一,但是因为历史原因,这个只能应用于内存,在硬盘上还是百家齐放。
- 在特点上:
- 兼容万国的编码
- 编码需要与其他编码有相对应的映射/转换关系
- 在特点上:

- 第四阶段,但是还是不能解决中文与日文等的相互转化,所以有了UTF-8
- 但是这时候内存还是以unicode为主,因为unicode有和各国相互转换的功能,所以算是一个过渡版本
- 总结一下就是,用支持相应语言的编码进行编码,用什么编码就用什么解码
三,可能出现的问题
在python2中读文件是默认的是ASCII码,python3中默认的是UTF-8。所以如果是用其他写的就需要在第一行上写如下内容:
1 # coding: 当初文件写入硬盘时采用的编码格式 读此行时是用默认的编码语言进行解读
- str类型
- 对于python3而言,str类型默认直接存成unicode格式,无论如何不会乱码
- 对于python2而言,str类型需要前面加上u,达到转变为unicode
四,编码与解码
1 # 1、unicode格式------编码encode-------->其它编码格式 2 >>> x='上' # 在python3在'上'被存成unicode 3 >>> res=x.encode('utf-8') 4 >>> res,type(res) # unicode编码成了utf-8格式,而编码的结果为bytes类型,可以当作直接当作二进制去使用 5 (b'\xe4\xb8\x8a', <class 'bytes'>) 6 7 # 2、其它编码格式------解码decode-------->unicode格式 8 >>> res.decode('utf-8') 9 '上'
五,文件
1,操作系统是直接控制硬盘的,而文件是一种让用户间接控制的一种方法。所以,操作文件就是操作硬盘。

2,如何使用文件:open()
控制文件的读写内容的模式
-
-
- t,文本
- 读写都是str(unicode)为单位的
- 必须指定encoding=‘utf-8
- 文本文件
- b,二进制/bytes
- 注意,t模式和b模式只是读的一种方式,真正操作还是需要其他的配合
- t,文本
-
六,操作文件
1,打开文件,注意防止转义符
open(r'c:/Users/dell/Desktop')
-
- 第一种,在文件前面加上r
- 第二种,使用‘/’
- 补充知识点:相对路径与绝对路径
- 相对路径,以打开的文件为基准,进行访问
- 绝对路径,如:C:\Users\dell\PycharmProjects\s14\day1\1.py
- 补充知识点:相对路径与绝对路径
1 f=open(r'venv\2.py',mode='rt',encoding='utf-8(没有指定时,liunx默认的是utf-8,windows默认的是gbk)') #此操作相当于给变量赋值和间接操作硬盘 2 print(f) 3 ************ 4 <_io.TextIOWrapper name='venv\\2.py' mode='r' encoding='cp936'>
2,操作文件:读文件/写文件
该过程是应用程序向操作系统调用,然后操作系统对硬盘进行操作
1 ret=f.read() 2 print(ret)
3,关闭文件
1 f.close() #回收操作系统资源 2 del f #回收应用程序资源 (但是第二步就算不进行操作,应用程序也会自己进行解除)
还有一种简单的打开文件的方法:
1 with open(r'venv') as f1: #不用写close 2 print(f1.read())
4,以t模式下演示
- rt,只读模式(当文件不存在时会报错),阅读完后指针停到最后。所以如果读第二遍需要重新打开文件,或者控制指针
1 with open(r'venv\2.py',mode='rt',encoding='utf-8') as f: 2 ret=f.read() 3 print(ret)
- wt,只写模式(当文件不存在时会创建,当文件已有时会清空),写完后指针会在第一行,不能阅读
- 如果在文件打开后没有关闭后多行写入,不会发生清空,会在后面追加
1 with open('b.txt',mode='w',encoding='utf-8') as f: 2 f.write('你好\n') 3 f.write('我好\n') 4 f.write('大家好\n') 5 f.write('111\n222\n333\n')
- 如果在文件打开后没有关闭后多行写入,不会发生清空,会在后面追加
- at,只追加模式(当文件不存在时会创建),打开已存在文件指针会停到最后一行,不能阅读
强调 w 模式与 a 模式的异同:# 1 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后# 2 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后
- 了解,一般不会用到,在实际工作中都是只读或只写
- r+t,在此模式下,可读可写,打开不存在文件时还是会报错,如果指针在第一行的话会覆盖原内容
- w+t,在此模式下,可读可写,读的时候需要控制指针
- a+t,在此模式下,可读可写,读的时候需要控制指针
- x模式,只写模式,不存在就创建,存在就报错
5,读,写的相关操作
-
- 读的代码
f.read() # 读取所有内容,执行完该操作后,文件指针会移动到文件末尾 f.readline() # 读取一行内容,光标移动到第二行首部 f.readlines() # 读取每一行内容,存放于列表中 - 第一种,第三种都容易导致文件过大,内存崩溃
- 写的相关操作
- f.writelines:适用于列表等需要多次写入的情况
1 f.writelines(['333\n','444\n'])
- 如果是数字、字母转为字节只需要前面加上b即可
1 f.write('11aa\n222\n'.encode('utf-8')) 2 想当于 3 f.write(b'11aa\n222\n')
- f.writelines:适用于列表等需要多次写入的情况
- 转为字节两种方式
1 "上".encode('utf-8') 2 bytes('上'.encode('utf-8'))
- 读的代码
6,f.read()
-
- 在t模式下(如果要写入的是数字类型就会报错,需要转成字符串),硬盘的二进制读入内存:会将二进制进行decode解码
- 1,读写都是以字符串(unicode)为单位
- 2,只能针对文本文件
- 3,必须指定字符串编码,即必须指定encoding参数
- 在b模式下,硬盘的二进制读入内存:不做任何转换,直接读入内存
- 1,读写是以bytes为单位
- 2,可以针对所有文件
- 3,一定不能指定字符编码,即一定不能指定encoding参数
- 总结:
1、在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更为方便 2、针对非文本文件(如图片、视频、音频等)只能使用b模式
- 在t模式下(如果要写入的是数字类型就会报错,需要转成字符串),硬盘的二进制读入内存:会将二进制进行decode解码
7,循环读文件的两种方式
-
- 第一种,while,是每次都读取指定字节
1 with open('1.mp4',mode='rb') as f: 2 while True: 3 data=f.read(1024) # 同一时刻只读入1024个Bytes到内存中 4 if len(data) == 0: 5 break 6 print(data)
- 第二种,for,按行读取,但是如果遇到每行特别长的情况下,最好使用第一种
1 with open('a.txt',mode='rt',encoding='utf-8') as f: 2 for line in f: 3 print(line) # 同一时刻只读入一行内容到内存中
- 第一种,while,是每次都读取指定字节
8,了解
-
-
f.flush() # 立刻将文件内容从内存刷到硬盘,但是谨慎使用,一般用于测试 -
f.readable() # 文件是否可读 -
f.writable() # 文件是否可写 -
print(f.closed) # 文件是否关闭 -
f.encoding # 如果文件打开模式为b,则没有该属性 -
f.name,查看文件名字
-
9,指针
指针的移动都是Bytes为单位的,唯一例外的是t模式下的read(n),n以字符为单位
f.seek(n,模式):指针一般是以字节为单位
-
- n,指的是移动个数,可以是负数
- 模式
- 0,参照物是文件开头位置
- 1,参照物为当前指针所在个数
- 2,参照物永远是末尾位置
- 注意,只有0才可以在t模式下使用,1,2可以在b模式下使用
- f.tell(),获取文件当前指针位置
10,文件的两种修改方式
注意:
1、硬盘空间是无法修改的,硬盘中数据的更新都是用新内容覆盖旧内容
2、内存中的数据是可以修改的
-
- 方式
- 1
1 # 实现思路:将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件 2 # 优点: 在文件修改过程中同一份数据只有一份 3 # 缺点: 会过多地占用内存 4 with open('db.txt',mode='rt',encoding='utf-8') as f: 5 data=f.read() 6 7 with open('db.txt',mode='wt',encoding='utf-8') as f: 8 f.write(data.replace('kevin','SB'))
- 2
1 # 实现思路:以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名 2 # 优点: 不会占用过多的内存 3 # 缺点: 在文件修改过程中同一份数据存了两份 4 import os 5 6 with open('db.txt',mode='rt',encoding='utf-8') as read_f,\ 7 open('.db.txt.swap',mode='wt',encoding='utf-8') as wrife_f: 8 for line in read_f: 9 wrife_f.write(line.replace('SB','kevin')) 10 11 os.remove('db.txt') 12 os.rename('.db.txt.swap','db.txt')
- 看情况选择使用
- 1
- 方式
posted on 2024-02-02 01:58 我才是最帅的那个男人 阅读(9) 评论(0) 收藏 举报
浙公网安备 33010602011771号