python文件处理
1、什么是文件?
文件是操作系统提供给用户/应用程序操作硬盘的一种虚拟概念(接口)
2、为什么要用文件?
#用户/应用程序可以通过文件将数据永久保存到硬盘中,即操作文件就是操作硬盘。 #用户/应用程序直接操作的是文件,对文件进行的所有操作都是在向操作系统发送系统调用,然后再由操作系统将其转换成具体的硬盘操作。
3、如何操作文件?
控制文件读写的模式有两种:t/b,这两种模式不能单独使用,必须要和r/w/a一起使用
t模式:
# 读写都必须以字符串(unicode)为单位 # 只能针对文本文件进行操作 # 需要指定字符编码(如:encoding='utf-8')
b模式:
# 读写都是以bytes 为单位 # 可以针对所有文件 # 不能指定字符编码
文件的操作模式
1、r模式的使用
# 登陆验证功能 inp_user = input(">>>>your name:").strip() inp_pwd = input(">>>>your password:").strip() with open('user.txt', mode='rt', encoding='utf-8') as f: for line in f: username, password = line.strip().split(':') if inp_user == username and inp_pwd == password: print('login success') break else: print('账号或密码错误')
2、w 模式的使用
# w模式用来创建全新的文件 # 文本文件的拷贝工具 src_file = input('源文件路径>>:').strip() copy_file = input('源文件路径>>:').strip() with open(r'{}'.format(src_file), mode='rt', encoding='utf-8') as f1, open(r'{}'.format(copy_file), mode='wt', encoding='utf-8') as f2: # res = f1.read() # f2.write(res) for line in f1: f2.write(line)
3、a 模式的使用
# a模式用来再原有的文件内容的基础之上写入新的内容,比如记录日志 # 注册功能 name = input('>>>>your name:').strip() pwd = input('>>>>your password:').strip() with open('db.txt', mode='at', encoding='utf-8') as f: f.write('{name}:{pwd} '.format(name,pwd))
4、+模式的使用(了解)
# +不能单独使用,必须配合r、w、a with open('g.txt',mode='r+t',encoding='utf-8') as f: # print(f.read()) f.write('中国') with open('g.txt',mode='w+t',encoding='utf-8') as f: f.write('111 ') f.write('222 ') f.write('333 ') print('====>',f.read()) with open('g.txt',mode='a+t',encoding='utf-8') as f: print(f.read()) f.write('444 ') f.write('5555 ') print(f.read())
控制文件读写内容的模式
1、t模式的使用
# t模式的存操作 ''' 1、读写都以字符串(unicode)为单位 2、只能针对文本文件 3、必须指定encoding字符编码 ''' # 1、r(默认的操作模式):只读模式,当文件不存在时报错,当文件存在时文件指针跳到开始位置 with open('r.txt', mode='rt', encoding='utf-8') as f: print('第一次读'.center(50,'*')) res = f.read() # 把所有内容从硬盘读入内存 print(res) print('第二次读'.center(50,'*')) res1 = f.read() # 把所有内容从硬盘读入内存 print(res1) # 2、w:只写模式,当文件不存在时会创建空文件,当文件存在时会清空文件,指针位于开始位置 ''' 强调1: 强调2:如果重新以w模式打开文件,则会清空文件内容 ''' with open('w.txt', mode='wt', encoding='utf-8') as f: f.write('哈哈哈 ') f.write('哈哈哈 ') f.write('哈哈哈 ') # 3、a:只追加写,在文件不存在时会创建空文档,在文件存在时文件指针会直接跳到末尾 with open('w.txt', mode='at', encoding='utf-8') as f: f.write('哈哈哈 ') f.write('哈哈哈 ') f.write('哈哈哈 ') ''' 强调w模式与a模式的异同: 相同点:再打开的文件不关闭的情况下,连续的写入,新内容总会跟在前写的内容之后 不同点:以a模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾 '''
2、b模式操作文件
# b: binary模式 ''' 1、读写都是以bytes为单位 2、可以针对所有文件 3、一定不能指定字符编码 ''' with open(r'a.mp4', 'rb') as f: f.read() # 文件拷贝工具 src_file = input('请输入源文件路径:').strip() copy_file = input('请输入文件保存的路径:').strip() file_name = src_file.split('\')[-1] with open(r'{}'.format(src_file), 'rb') as rf, open(r'{src}{copy}'.format(src=copy_file, copy=file_name), 'wb') as wf: for line in rf: wf.write(line) # 循环读取文件 # 方式一:自己控制每次读取的数据量 with open(r'test.jpg', 'rb') as f: while True: res = f.read(1024) # 一次只读1024个字节 if len(res) == 0: break print(len(res)) # 方式二:以行为单位,一次读取一行的数据 with open(r'test.jpg','rb') as f: for line in f: print(line)
文件操作的方法
1、读写操作:
# 一:读相关操作 # 1、readline:一次读一行 with open(r'test.txt', 'rt', encoding='utf-8') as f: while True: line = f.readline() if len(line) == 0: break print(line) # 2、readlines: with open(r'test.txt', 'rt', encoding='utf-8') as f: while True: line = f.readlines() print(line) ''' 强调: f.read()与f.readlines()都是将内容一次性读入内容,如果内容过大会导致内存溢出 ''' # 二:写相关操作 # 3、f.writelines(): with open(r'test.txt', 'wt', encoding='utf-8') as f: # f.write('1111 222 3333 ') # l=['1111 ', '2222', 3333] # 会报错,应为是t模式,必须是str类型 l=['1111 ', '2222', '3333'] # for line in l: # f.write(line) f.writelines(l) with open(r'test.txt', 'wb') as f: # 补充1:纯英文字符,可以不做转换通过加前缀b得到bytes类型 l=[b'1111 ', b'2222', b'3333'] # 补充2:'上'.encode('utf-8')等同于bytes('上',encoding='utf-8') l=['矮跟'.encode('utf-8'), '大'.encode('utf-8'), 'SB'.encode('utf-8')] l=[ bytes('矮跟',encoding='utf-8'), bytes('大',encoding='utf-8'), bytes('SB',encoding='utf-8') ] f.writelines(l) # 4、flush (大多数情况不用) with open(r'test.txt', 'wt', encoding='utf-8') as f: f.write('哈哈哈') f.flush() # 告诉操作系统,强制立刻将数据写入内存
2、其他操作(了解)
with open(r'test.txt', 'wt', encoding='utf-8') as f: print(f.readable()) # 文件是否可读 print(f.writable()) # 文件是否可写 print(f.closed) # 文件是否关闭 print(f.encoding) # 如果文件打开模式为b,则没有该属性 print(f.flush()) # 立刻将文件内容从内存刷到硬盘 print(f.name) # 获取文件名
3、控制文件指针的移动
''' 指针移动的单位都是以bytes/字节为单位 只有一种情况下特殊: t模式下的read(n),n代表的是字符个数 ''' with open('test.txt', 'rt', encoding='utf-8') as f: res=f.read(4) print(res) # f.seek(n,模式):n指的是移动的字节个数 # 模式0:参照物是文件开头位置 f.seek(9,0) # 9 f.seek(3,0) # 3 # 模式1:参照物是当前指针所在位置 f.seek(9,1) # 9 f.seek(3,1) # 12 # 模式2:参照物是文件末尾位置,应该倒着移动 f.seek(-9,2) # 3 f.seek(-3,2) # 9 ''' 强调:只有0模式可以在t下使用,1、2必须在b模式下使用 '''