Python文件操作
- 文件操作方法
- 文件操作模式
- 简易版本的拷贝功能
- 文本模式与二进制模式读写操作
- 文件内光标的移动
- 文件内容修改
一、文件操作方法
1. 读系列
read() 一次性读取文件内所有的内容
with open(r'a.txt', 'r', encoding='utf8') as f: print(f.read()) # 一次性读取文件内所有的内容
readline() 每次只读文件一行内容
with open(r'a.txt', 'r', encoding='utf8') as f: print(f.readline()) # 每次只读文件一行内容
readlines() 读取文件内所有内容,组织成列表,每个元素是文件的每行内容
with open(r'a.txt', 'r', encoding='utf8') as f: print(f.readlines()) # 读取文件所有的内容,组织成列表,每个元素是文件的每行内容
readable() 判断当前文件是否可读
with open(r'a.txt', 'r', encoding='utf8') as f: print(f.readable()) # 判断当前文件是否具备读的能力
2. 写系列
write() 往文件中写入文件内容
with open(r'a.txt', 'w', encoding='utf8') as f: f.write('aaa\nbbb\nccc') # 写入内容必须是字符串类型
文件中就出现了写入的内容:
writelines() 可以将列表中多个字符串元素全部写入
with open(r'a.txt', 'w', encoding='utf8') as f: f.writelines(['ddd', 'eee', 'fff']) # 可以将列表中多个字符串元素全部写入
文件中如图所示:
writeable() 判断当前文件是否具备可写能力
with open(r'a.txt', 'w', encoding='utf8') as f: print(f.writable()) # 判断当前文件是否具备可写能力
flush() 在Python中调用文件写方法时,紧接着调用flush()方法,可以将文件立即写入磁盘中
with open(r'a.txt', 'w', encoding='utf8') as f: f.write('aaa\nbbb\nccc') f.flush() # 直接将内存内文件数据刷到硬盘 相当于ctrl+s
3. 文件优化操作
with open(r'a.txt', 'r', encoding='utf8') as f: print(f.read()) # 一次性读取文件内所有的内容 print(f.read()) # 一次性读取文件内所有的内容 print(f.read()) # 一次性读取文件内所有的内容
可以看出,这种方法去取文件存在一些问题:
1) 一次性读取完之后,光标停留在了文件末尾,无法再抽读取内容
2) 该方法在读取大文件的时候,可能会造成内存溢出的情况
我们可以使用逐行读取文件内容的方式解决上述问题。
with open(r'a.txt', 'r', encoding='utf8') as f: for line in f: # 文件变量名f支持for循环,相当于一行行读取文件内容 print(line, end='')
涉及到多行文件内容的情况一般都是采用for循环读取。
二、文件操作模式
1. t 文本模式
1) 文本模式是默认的模式,r只读、w只写和a只追加默认为 rt wt at
2) 该模式所有操作都是以字符串为基本单位(文本)
3) 该模式必须要指定encoding参数
4) 该模式只能操作文本文件
2. b 二进制模式
1) 该模式需要指定,使用二进制模式用 rb wb ab
2) 该模式所有操作都是以bytes类型(二进制)基本单位
3) 该模式不需要指定encoding参数
4) 该模式可以操作任意类型的文件
三、简易版本的拷贝内容
1.功能
1) 获取待拷贝的目标文件路径
2) 获取即将拷贝到哪个地方的新路径
3) 利用文件操作实现数据拷贝
2. 实现
# 1.待拷贝的文件路径 wait_copy_file = input('待拷贝的文件路径:').strip() # 2.新的文件路径 new_file_path = input('新路径:').strip() # 3.以r模式打开步骤1的路径,以w模式打开步骤2的路径 with open(r'%s' % wait_copy_file, 'rb') as f1, \ open(r'%s' % new_file_path, 'wb') as f2: for line in f1: f2.write(line)
a.txt中的内容:
b.txt中的内容:
拷贝成功!该程序使用的是二进制模式,支持拷贝其他格式的文件(如:jpg、mp4等)。
四、文本模式与二进制模式读写操作
1. read() 括号内可以放数字
在t模式下表示字符个数
在b模式下表示字节个数
英文字符统一使用一个bytes来表示,中文字符统一使用三个bytes来表示
2. 例子
with open(r'a.txt', 'rb') as f: print(f.read(6).decode('utf8'))
结果输出两个中文字符:
with open(r'a.txt', 'r', encoding='utf8') as f: print(f.read(4))
结果输出四个中文字符:
五、文件内光标的移动
1. seek() 控制文件内光标的移动
f.seek(offset, whence)
offset表示位移量
1) 始终是以字节为最小单位
2) 正数是从左往右移动
3) 负数是从右往左移动
whence表示模式
1) 0:以文件开头为参考系(支持tb两种模式)
2) 1:只支持b模式,以当前位置为参考系
3) 2:只支持b模式,以文件末尾为参考系
2. 小练习
实现动态查看最新一条日志的效果
import time with open('a.txt', 'rb') as f: f.seek(0, 2) while True: line = f.readline() if len(line) == 0: # 没有内容 time.sleep(0.5) else: print(line.decode('utf-8'), end='')
六、文件内容修改
1. 覆盖
with open(r'a.txt', 'r', encoding='utf8') as f: data = f.read() with open(r'a.txt', 'w', encoding='utf8') as f1: new_data = data.replace('aaa', 'ccc') f1.write(new_data)
修改前:
修改后:
2. 新建
import os with open('a.txt', mode='rt', encoding='utf-8') as read_f, \ open('a.txt.swap', mode='wt', encoding='utf-8') as write_f: for line in read_f: write_f.write(line.replace('ccc', 'fff')) os.remove('a.txt') # 删除原文件 os.rename('a.txt.swap', 'a.txt') # 重命名文件
修改前:
修改后: