文件处理:
一、引入
1.什么是文件:文件是操作系统提供给用户/应用程序操作硬盘的一种虚拟的概念/接口
2.为什么要用文件:用户/应用程序可以通过文件将数据永久保存的硬盘中即操作文件就是操作硬盘
用户/应用程序直接操作的是文件,对文件进行的所有的操作,都是
在向操作系统发送系统调用,然后再由操作将其转换成具体的硬盘操作
3.这么用文件:open()
控制文件读写内容的模式:t和b
强调:t和b不能单独使用,必须跟r/w/a连用
t:文本(默认的模式)
1、读写都以str(unicode)为单位的
2、文本文件
3、必须指定encoding='utf-8'
b:二进制/bytes
控制文件读写操作的模式
r只读模式
w只写模式
a只追加写模式
+:r+、w+、a+
二、文件处理的基本流程:
1.打开文件(open)
open(‘C:a.txt bcd.txt’) # 注意: 必须转义,可以在路径前加‘r’ 或者用 /
2.操作文件(读/写)
应用程序对文件的读写请求都是在向操作系统发送系统调用,然后由操作系统控制硬盘把输入读入内存、或者写入硬盘
res=f.read() print(res)
3.关闭文件(close)
f.close() # 回收操作系统资源 f.read() # 变量f存在,但是不能再读了,报错! f.read() # 变量f存在,但是不能再读了 del f # 回收应用程序资源
2.with open() as
1.当我们打开一个文件时会占内存和操作系统资源,如果没有手动将其close,那么会对造成资源浪费,对此python提供了with关键字来帮我们管理上下文:
# 1、在执行完子代码块后,with 会自动执行f.close() with open('a.txt','w') as f: pass # 2、可用用with同时打开多个文件,用逗号分隔开即可 with open('a.txt','r') as read_f,open('b.txt','w') as write_f: data = read_f.read() write_f.write(data)
2.指定文件编码:
在打开文本文件时,如果没有指定编码格式,则会按照系统默认格式,windows下是gbk,在linux下是utf-8。
若要保证不乱码,文件以什么方式存的,就要以什么方式打开。
with open('c.txt',mode='rt',encoding='utf-8') as f: res=f.read() # t模式会将f.read()读出的结果解码成unicode
内存:utf-8格式的二进制-----解码----->>unicode
硬盘(c.txt内容:utf-8格式的二进制)
三、文件操作模式
一、以t模式为基础进行内存操作:
1. r 模式(默认):只读模式,当文件不存在时报错,当文件存在时文件指针跳到开始位置
with open('c.txt',mode='rt',encoding='utf-8') as f: res=f.read() # 把所有内容从硬盘读入内存 print(res) #实例: inp_username=input('your name>>: ').strip() inp_password=input('your password>>: ').strip() # 验证 with open('user.txt',mode='rt',encoding='utf-8') as f: for line in f: # print(line,end='') # egon:123 username,password=line.strip().split(':') if inp_username == username and inp_password == password: print('login successfull') break else: print('账号或密码错误')
2. w 模式:只写模式,当文件不存在时会创建空文件,当文件存在会清空文件,指针位于开始位置
with open('b.txt',mode='w',encoding='utf-8') as f: f.write('你好 ') f.write('我好 ') f.write('大家好 ') #强调: # 1 在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面 # 2 如果重新以w模式打开文件,则会清空文件内容 #案例:w模式用来创建全新的文件 #文件的copy工具 src_file=input('源文件路径>>: ').strip() dst_file=input('源文件路径>>: ').strip() with open(r'{}'.format(src_file),mode='rt',encoding='utf-8') as f1, open(r'{}'.format(dst_file),mode='wt',encoding='utf-8') as f2: res=f1.read() f2.write(res)
3. a 追加写模式:在文件不存在时会创建空文档,在文件存在时文件指针会直接调到末尾
with open('c.txt',mode='a',encoding='utf-8') as f: f.write('66666 ') f.write('88888 ') #强调 w 模式与 a 模式的异同: # 1 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后 # 2 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后 #案例:a模式用来在原有的文件内存的基础之上写入新的内容,比如记录日志、注册 #注册功能 name=input('your name>>: ') pwd=input('your name>>: ') with open('db.txt',mode='at',encoding='utf-8') as f: f.write('{}:{} '.format(name,pwd))
4. + 模式:不能单独使用,必须配合r、w、a
r+ w+ a+ :可读可写
在平时工作中,我们只单纯使用r/w/a,要么只读,要么只写,一般不用可读可写的模式