文件操作
文件是操作系统给用户/应用程序的一种虚拟单位,文件直接映射的是硬盘空间。
应用程序 >>>(发送指令)>>> 操作系统 >>>(操控硬件)>>> 硬盘数据
ps:文件路径:
绝对路径:从磁盘开始找到文本文件的位置
相对路径:文本文件与执行文件所在同一文件夹
一.操控文件:
普通方法:
f = open() # 向操作系统发送请求,发开文件 f.read() # 对文件进行的操作 f.close() # 关闭文件,打开的文件会占据应用程序和操作系统内存空间,所以操作完文件后要关闭文件
推荐方法:
with open(r'文件地址',mode='打开方法',encoding=' ') as f(f是变量名):
print(f) # f是文件对象(句柄)
f.read # 想操作系统发送请求,对问价进行操作
print(f.read) # 若文件是可读类型,打印出整个文件的内容
代码块1
代码块1
... # 当代码快执行完后,自动关闭文件,优化内存,无序手动关闭
二.处理文件的的模式:
文件的打开方式
r 只读模式:当文件存在,读出文件内容,当文件不存在,报错。
w 只写模式:当文件存在,清空文件,光标移动到文件开头,当文件不存在则创建文件。
a 追加写模式:当文件存在,光标移动到文件末尾,文件不存在创建文件
r+ 可读可写,当文件存在,可读写文件,文件不存在则报错 w+ 可写可读,当文件存在,清空文件,文件不存在创建文件 a+ 可写可读,当文件存在,光标移动到文件末尾,不存在则创建
文件的打开格式
t 文本文件:
1.文件内容都是以字符串为单位的
2.只能针对文本
3.必须指定encoding参数
b 二进制模式:
1.读写文件都是以Bytes/二进制为单位的
2.针对所有对象
3.一定不能指定ending参数
三.内置方法:
r 模式下的文件处理方法
with open(r'r_file.txt',mode='rt',encoding='utf-8') as f: print(f) # 文件对象,也叫句柄 print(f.readable()) # 文件是否可读 Ture print(f.writable()) # 文件是否可写 False print(f.read()) # 读取整个文件内容 光标停留在最后的位置 print(f.readline()) # 一行一行读取文件的内容 包括(\r\n) print(f.readline()) print(f.readlines()) # 读出全部内容,返回的是一个别表,每一行是内容是字符串包括\r\n #readlines 的内部原理是for循环文件,取出的内容添加到列表里 r_list = [] for line in f: # 文件可以别for循环 r_list.append(line) print(r_list)
w 模式下的文件处理方法: 慎用!!!
with open(r'D:\OldBoy-py\文件\w_flie.txt',mode='wt',encoding='utf-8') as f: print(f) # 文件对象,也叫句柄 print(f.readable()) # 文件是否可读 False print(f.writable()) # 文件是否可写 True f.write('wong\n') # 清空整个文件,写入‘wong’ f.write('wong\t') # 清空整个文件,写入‘wong’ f.write('wong') # 清空整个文件,写入‘wong’ w_list = ['wong\t','waller\n','age','20'] f.writelines(w_list) # 将列表的内容写到文件,列表里的数据为字符串类型 for line in w_list: f.write(line)
a 模式下的文件处理方法:
with open(r'a_flie.txt',mode='at',encoding='utf-8') as f: print(f) # 文件对象,也叫句柄 print(f.readable()) # 文件是否可读 False print(f.writable()) # 文件是否可写 True f.write('\nwong\r') f.write('waller') a_list = ['wong\t', 'waller\n', 'age', '20'] f.writelines(a_list)
read() 括号内的数:
#文件seek.txt #内容:
用户名waller 123是密码 #在‘rt’模式下,read括号内的数表示的是字符的个数,除此之外均表示字节数 with open(r'seek.txt',mode='rt',encoding='utf-8') as f: res = f.read(3) print(res) # >>> 用户名 #在‘rb’模式下,read括号内的数表示的是字节数 with open(r'seek.txt','rb') as f: res = f.read(10) # 读的是10个字节 Bytes print(res) # >>> b'\xe7\x94\xa8\xe6\x88\xb7\xe5\x90\x8dw' res_str = res.decode('utf-8') # 将二进制解码成字符串形式 # res_str = str(res,encoding='utf-8') # 将二进制解码成字符串形式 print(res_str) # >>> 用户名w
文件内光标移动seek
# f.seek(offset,whence) #offset:光标的相对偏移量,移动的位数 ,只能是字节数 #whence: # 0 参照文件的开头,t b 模式均可以使用 # 1 参照光标当前的位置,b 模式可以使用 # 2 参照文件的末尾,b 模式可以使用 with open(r'seek.txt','rt',encoding='utf-8') as f: print(f.read(1)) # >>> 用 f.seek(6,0) # 光标从文件开头移动6个字节的位置 print(f.read(1)) # >>> 户 从第6个字节的位置向后读取一个字符 with open(r'seek.txt','rb') as f: res = f.read(3) # rb模式下读的是二进制的字节数,注意如果有汉字要把一个汉字完整的字节数都读出来,否则报错 print(res) # >>> b'\xe7\x94\xa8' print(str(res,encoding='utf-8')) # >>> 用 f.seek(9,0) print(f.read(3)) # >>> b'wal' with open(r'seek.txt','rt',encoding='utf-8') as f: print(f.read(1)) # >>> 用 f.seek(0,1) # 参照当前光标的位置移动0个位置 print(f.read(1)) # >>> 户 with open(r'seek.txt','rb') as f: print(f.read(3)) # >>> b'\xe7\x94\xa8' print(f.read(3).decode('utf-8')) # >>> 户 f.seek(3,1) # 参照光标当前的位置把光标移动3个字节 print(f.read(3)) # >>> b'wal' print(str(f.read(3),encoding='utf-8')) # >>> ler with open(r'seek.txt','rb') as f: f.seek(-6,2) # 光标参照末尾向前移动个字节 ser = f.read(6) print(ser) # >>> b'\xe5\xaf\x86\xe7\xa0\x81' print(ser.decode('utf-8')) # >>> 密码
四.应用
文件内容监测:
with open(r'文件内容检测.txt','rb')as f: f.seek(0,2) # 把光标移动到文件末尾,只能b模式 while True: # 循环判断 res = f.readline() # 打印新增的一行内容 if res: # 判断是否新增了内容 print(res.decode('utf-8')) # 如果新增了则打印出新增的内容
截断文件内容
with open(r'文件截断.txt','a',encoding='utf-8') as f: # 也可以用 r+ f.truncate(3) # >>> 用 # 截取文件3个字节的内容,将文件内推清空,并把截取的内容添加到该文件内
文件修改
''' 方法一: 1.将文件由硬盘读到内存 2.在内存中操作文件,此时不影响硬盘里的文件 3.改写覆盖原文件 ''' with open(r'文件修改.txt','rt',encoding='utf-8') as f: # 由硬盘读到内存 res = f.read() # 拿到文件的内容,赋值给一个变量 print(res) with open(r'文件修改.txt','w',encoding='utf-8') as f: data = res.replace('waller','wong') # 修改替换文件的内容 print(data) f.write(data)
优点:任意时间硬盘上只有一个文件 不会占用过多硬盘空间
缺点:当文件过大的情况下,可能会造成内存溢出
''' 方法二: 1.创建一个新文件 2.把原文件的内容一行一行读出来并修改 3.将修改的内容一行一行添加到新文件里 4.新文件的名字修改成和源文件一样的名字,并删除原文件 ''' import os # 调用模块 with open(r'文件修改.txt','rt',encoding='utf-8')as f,\ open(r'新文件修改.txt','at',encoding='utf-8') as j: for line in f: res = line.replace('waller', 'wong') j.write(res) os.remove('文件修改.txt') os.rename('新文件修改.txt','文件修改.txt')
优点:内存中始终只有一行内容 不占内存
缺点:再某一时刻硬盘上会同时存在两个文件