目录
文件的基本操作
什么是文件
文件是操作系统虚拟出来的概念,用来存储信息
操作文件的流程
- 打开文件
- 修改/读取文件
- 保存文件
- 关闭文件
f = open('test.txt', 'w', encoding='utf8') # 打开文件
f.write('''
孩儿立志出湘关,学不成名誓不还
埋骨何须桑之地,人生无处不青山
''') # 修改文件
f.flush() # 快速保存,可以不用
f.close() # 关闭文件
文件打开模式的三种方式
文件操作的基础模式有三种:
- r 只读不可写
- w 清空文件只写不可读
- a 模式 追加 只写不可读
文件操作的两种方法: (默认是t模式)
- t模式为text 文本
- b模式 为 二进制数
t / b模式不能单独使用,需要与r / w / a 连用
文件操作之r模式
f = open('test.txt', 'r', encoding='utf-8')
data = f.read()
print(data)
print(f.readable()) # True
print(f.writable()) # False
f.read()读取文件指针会走到文件末尾,再次读取会 空格
f = open('test.txt', 'r', encoding='utf-8')
data1 = f.read()
data2 = f.read()
print('data1:', data1)
print('data2:', data2)
# 打印结果:
data1: 孩儿立志出相关,学不成名誓不还
埋骨何须桑梓地,人生何处不青山
data2:
f.read() 一次性读取文件内容,如果文件过大,内存可能会爆炸,可以用f.readline() / f.readlines()读取
f = open('test.txt', 'r', encoding='utf-8')
data1 = f.readline() # 一行行读取
data2 = f.readlines() # 读取后,放入列表存起来
print(data1)
print(data2)
# 打印结果:
孩儿立志出相关,学不成名誓不还
['埋骨何须桑梓地,人生何处不青山
']
rb模式 读二进制文件,不需要字符编码
f = open('test.txt', 'rb')
data = f.read()
print(data)
# 打印结果:
b'xe5xadxa9xe5x84xbfxe7xabx8bxe5xbfx97xe5x87xbaxe7x9bxb8xe5x85xb3xefxbcx8cxe5xadxa6xe4xb8x8dxe6x88x90xe5x90x8dxe8xaax93xe4xb8x8dxe8xbfx98
xe5x9fx8bxe9xaaxa8xe4xbdx95xe9xa1xbbxe6xa1x91xe6xa2x93xe5x9cxb0xefxbcx8cxe4xbaxbaxe7x94x9fxe4xbdx95xe5xa4x84xe4xb8x8dxe9x9dx92xe5xb1xb1
'
文件操作之w模式
w模式,只可写不可读,如果文件存在则清空文件内容写入;如果文件不存在则创建文件写入内容。
f = open('test.txt', 'w', encoding='utf-8')
f.write('asfg')
文件操作之a模式
a模式,只可写不可读,文件存在则在文件的末端追加内容; 文件不存在则创建文件写入内容。
f = open('test.txt', 'a', encoding='utf-8')
f.write('qqq')
绝对路径和相对路径
- 绝对路径: 从盘符开始 D:project est.py
- 相对路径:执行文件(当前运行的文件)的文件夹下的文件名,执行文件和打开文件属于同一文件夹下
with管理上下文
with提供一个自动关闭文件(解除了操作系统的占用)
with open('test.txt', 'r', encoding='utf-8') as fr:
data = fr.read() # 缩进下不会关闭文件,在缩进下对文件进行操作
print(data)
print(fr) # 关闭文件(操作系统层面上的) 但文件还存于python内存中
# print(fr.read()) # 这里的操作设计操作系统,会报错
文本文件处理的高级应用
三种可读可写的模式
- r+ 可读,可写
- w+ 清空文件可写,可读
- a+ 追加写,可读
文件内指针移动
seek(offset, whence):
offset表示指针的偏移量,
whence 规定只有 0 ,1 ,2 三种模式
-
0表示光标在文件头
-
1表示光标在当前位置
-
2表示光标在文件尾部
with open('36r.txt', 'rb') as fr:
print(f"fr.seek(4, 0): {fr.seek(4, 0)}") # 0相当于文件头开始;1相当于当前文件所在位置;2相当于文件末尾
fr.seek(0,2) # 切换到文件末尾
tell 告诉你当前位置
with open('test.py', 'rb') as fr:
fr.seek(3, 0)
print(fr.tell())
truncate: 截断
光标从文件头开始,到括号内的数字,之后的都删除
with open('1.txt', 'ab') as fa:
fa.truncate(2)
以上seek,tell,truncate都是以字节为单位的
read 移动光标以字符为单位
with open('1.txt', 'r', encoding='utf8') as fr:
print(fr.read(3)) # n表示n个字符,不加默认读取所有 # 中文和英文都属于一个字符
文件的修改
把硬盘中的文件全部读入内存中,一次性修改,修改完毕在覆盖在硬盘中
import os
with open('test.txt', 'r', encoding='utf-8') as fr,
open('test_swap.txt', 'w', encoding='utf-8') as fw:
data = fr.read() # 把文件一次性读入内存
data = data.replace('青山', '故乡') # 在内存中修改文件
fw.write(data) # 把修改后的文件写入新文件
# 删除原文件
os.remove('test.txt')
# 把新文件重命名为原文件
os.rename('test_swap.txt', 'test.txt')
如果文件过大,一次性读入内存会炸掉,可以一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖原文件
import os
with open('test.txt', 'r', encoding='utf-8') as fr, open('test_swap.txt', 'w', encoding='utf-8') as fw:
# 循环读取文件内容,逐行修改
for line in fr:
data = line.replace('青山', '故乡')
# 写入新文件
fw.write(data)
os.remove('test.txt')
os.rename('test_swap.txt', 'test.txt')