文件处理
1.文件的基本介绍
什么是文件? 操作系统提供给用户操作复杂硬件(硬盘)的简易的接口
为什么要操作文件? 人或者应用程序需要永久的保存数据
如何使用?
f = open() #表示打开文本 f.read() #表示读取文本内的所有内容 f.close() #表示关闭文件
都是通过python代码来操作文件
f = open(r' 文件地址,ending = 'utf-8') #向操作系统发送请求 打开某个文件, r 表示取消转义 # 应用程序要想操作计算机硬件 必须通过操作系统来简单的操作 print(f) # f是文件对象 print(f.read()) #windows操作系统默认的编码是gbk f.read() #向操作系统发送请求 读取文件内容 f.close() # 告诉操作系统 关闭打开的文件 print(f) print(f.read())
2.文件上下文操作 (可同时打开多个文本文件)
with open(r'文件位置','r',ending = 'utf-8') as f #f仅仅是一个变量名,可以把它看成是一个遥控器。
(1)操作文件单位的方式
文本文件 t在使用的时候需要指定encoding参数, 如果不指定,就默认是操作系统的默认编码
rb指二进制模式,在含‘b’的模式中,不需要指定encoding参数。
文件打开的模式有三种:①r 只读模式;② w 只写模式;③ a 追加写模式
(2)操作文件单位的方式:
1)t 文本文件。t在使用的时候需要指定encoding参数,如果不知道默认是操作系统的默认编码。
2)b 二进制 。一定不能指定encoding参数,mode参数可以不写,不写的话默认是rt只读的文本文件,这个t不写默认就是t。
with open(r' 文本位置地址',mode='r',encoding='utf-8') as f: print (f.readable( )) #是否可读 print (f.writable( )) #是否可写 print (f.read( )) #一次性将文件的内容全部读出
3)r 模式在打开文件的时候,如果文件不存在,直接报错。’
文件路径可以写相对路径,但是需要注意该文件必须与执行文件在同一层文件下
with open(r'文件位置地址,encoding='utf-8') as f: 其中mode关键字可以不写 print(f.readable()) print(f.writable()) print(">>>1:") print(f.read()) # 一次性将文件内容全部读出 print('>>>2:') print(f.read()) #读完一次之后,文件的光标已经在文件末尾了,再读就没有内容可读了 print(f.readlines())#返回的是一个列表,列表中的一个个元素对应的就是文件的一行行内容 for line in f:# f 可以被for循环for每循坏一次就读一行内容 print(i)#这个方法可以解决大文件一次性读取占用内存过高的问题 print(f.readline()) #只读取文件的一行内容
4)w模式:w模式一定要慎用
- 文件不存在的情况下,自动创建该文件。
- 当文件存在的情况下 会先清空文件内容再写入
with open(r'xxx.txt',mode='w',encoding='utf-8') as f: print(f.readable()) # 是否可读 print(f.writable()) # 是否可写
5)a模式 追加模式(将内容追加到尾部)
- 当文件不存在的情况下 自动创建该文件
- 当文件存在的情况下,不清空文件内容, 文件的光标会移动文件的最后
with open(r'yyy.txt',mode='a',encoding='utf-8') as f: print(f.readable()) # 是否可读 print(f.writable()) # 是否可写 f.write('我是小尾巴 ')
3.打开文本的模式有以下几种
(1).打开文件的模式有(默认为文本模式):
r ,只读模式【默认模式,文件必须要存在,如果不存在会出现报警】
w,只写模式【不可读;不存在则会创建;存在则清空内容】
a,之追加写模式【不可读;不存在则创建;存在则只追加内容】
(2).对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作
rb、wb、ab
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
(3)."+" 表示可以同时读写某个文件
r+, 读写【可读,可写】
w+,写读【可读,可写】
a+,写读【可读,可写】
补充:在 rt 模式下,read内的数字表示的是字符的个数,除此之外,数字表示的都是字节
with open(r'test','r',encoding='utf-8') as f: print(f.read(5))
(4).文件内光标的移动
f.seek(offset,whence) # seek的长度是按字节来计算的 offset:相对偏移量 #光标移动的位数 whence: 0:参照文件的开头 t和b都可以使用 1:参照光标所在的当前位置 只能在b模式下用 2:参照文件的末尾 只能在b模式下使用
(5).截断文件
with open(r'文本位置',‘a’,encoding=utf-8')as f: f.truncate(6) # 接收的字节的长度(整型), # 保留0~6字节数 后面的全部删除(截断)
4.文件的修改
# 文件a.txt内容如下 张一蛋 山东 179 49 12344234523 李二蛋 河北 163 57 13913453521 王全蛋 山西 153 62 18651433422 # 执行操作 with open('a.txt',mode='r+t',encoding='utf-8') as f: f.seek(9) f.write('<主任>') # 文件修改后的内容如下 张一蛋 <主任> 179 49 12344234523 李二蛋 河北 163 57 13913453521 王全蛋 山西 153 62 18651433422 # 强调: # 1、硬盘空间是无法修改的,硬盘中数据的更新都是用新内容覆盖旧内容 # 2、内存中的数据是可以修改的
(1)文件修改文件一
先将数据由硬盘读到内存(读文件),在内存中完成修改(字符串的替换),再覆盖原来的内容(写文件)
with open(r'test02.txt','r',encoding='utf-8') as f: data = f.read() #只读模式 print(data) print(type(data)) #查看data的数据类型 with open(r'test02.txt','w',encoding='utf-8') as f: res = data.replace('egon','jason') #repalce(旧值,新值) print(data) f.write(res) # 优点:任意时间硬盘上只有一个文件 不会占用过多硬盘空间 # 缺点:当文件过大的情况下,可能会造成内存溢出
(2)文件修改方式二
创建一个新文件;循环读取老文件内容到内存进行修改 将修改好的内容写到新文件中;将老文件删除 将新文件的名字改成老文件名。
import os with open(r'旧的文本位置','r',encoding='utf-8') as read_f, open(r'新建的文本位置','a',encoding='utf-8') as write_f: for line in read_f: new_line = line.replace('jason','egon') write_f.write(new_line) os.remove('旧的文本位置t') os.rename('新的文本位置','旧的文本位置’) # 通过新建一个文本文件来取代旧的文本文件 # 优点:内存中始终只有一行内容 不占内存 # 缺点:在某一时刻硬盘上会同时存在两个文件