上期文章
python文件操作
1 文件的编码
使用编码技术将内容翻译成0和1存入,编码技术记录了翻译的规则,如何将内容翻译成二进制,以及如何将二进制翻译回可识别内容
计算机中有许多可用编码:UTF-8、GBK、Big5等,不同的编码将内容翻译成二进制也是不同的
UTF-8是目前全球通用的编码格式,一律以UTF-8格式进行文件编码即可
2 文件的读取
一篇文章、一段视频、一个可执行程序都可以被保存为一个文件,并赋予一个文件名,操作系统以文件为单位管理磁盘中的数据
文件可以分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别
文件操作主要包括打开、关闭、读、写等操作
open()打开操作
open(name, mode, encoding)
name:目标文件名的字符串(可以包含文件所在的具体路径)
mode:设置打开文件的模式(访问模式):只读、写入、追加等
encoding:编码格式,推荐使用UTF-8
f = open('测试.txt', 'r', encoding='UTF-8')
注意:
f是open函数的文件对象,对象是python的一种特殊数据类型,拥有属性和方法,可以使用对象.属性火对象.方法进行访问
mode三种基础访问模式
模式 | 描述 |
---|---|
r | 以只读方式打开文件,文件的指针将会放在文件的开头,这是默认模式 |
w | 打开一个文件只用于写入,如果该文件以存在则打开文件,并从开头开始编辑,原有内容会被删除,如果该文件不存在,创建新文件 |
a | 打开一个文件用于追加,如果该文件以存在,新的内容将会被写入到已有内容之后,如果该文件不存在,创建新文件进行写入 |
f = open('测试.txt', 'r', encoding='UTF-8')
print(type(f))
<class '_io.TextIOWrapper'>
读操作
read()
文件对象.read(num)
num:从文件中读取的数据长度(单位是字节),如果没有传入num,就表示读取文件中所有的数据
对同一个文件对象进行不同的读取操作,会从上一个操作的结尾处开始
f = open('测试.txt', 'r', encoding='UTF-8')
print(f.read(11))
《海绵宝宝》的故事情节
f = open('测试.txt', 'r', encoding='UTF-8')
print(f.read(11))
print(f"全部读写内容\n{f.read()}")
《海绵宝宝》的故事情节
全部读写内容
主要围绕着主角海绵宝宝和他的好朋友派大星、邻居章鱼哥、上司蟹老板等生物展开
场景设定于太平洋海底
一座被称为比奇堡的城市
这部动画除了固定描绘的卡通场景与人物之外
也会穿插一些真实的物件或人物
但海绵宝宝卡通的内容基本上与海洋知识无关
甚至夸大到完全不合乎科学与常识
例如海底生火、海底冲澡等
剧集内容也会时不时的嘲笑精致艺术和章鱼哥的劳工权益想法。
注意:
如果调用两次read,则第二次read将从第一次read读到的结尾处继续读取
readlines()
readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素
lines = f.readlines()
print(type(lines))
print(lines)
['《海绵宝宝》的故事情节主要围绕着主角海绵宝宝和他的好朋友派大星、邻居章鱼哥、上司蟹老板等生物展开\n', '场景设定于太平洋海底\n', '一座被称为比奇堡的城市\n', '这部动画除了固定描绘的卡通场景与人物之外\n', '也会穿插一些真实的物件或人物\n', '但海绵宝宝卡通的内容基本上与海洋知识无关\n', '甚至夸大到完全不合乎科学与常识\n', '例如海底生火、海底冲澡等\n', '剧集内容也会时不时的嘲笑精致艺术和章鱼哥的劳工权益想法。']
readline()
一次读取一行内容
line = f.readline()
print(line)
line = f.readline()
print(line)
f.close()
《海绵宝宝》的故事情节主要围绕着主角海绵宝宝和他的好朋友派大星、邻居章鱼哥、上司蟹老板等生物展开
场景设定于太平洋海底
for循环读取文件行
for line in f:
print(line)
《海绵宝宝》的故事情节主要围绕着主角海绵宝宝和他的好朋友派大星、邻居章鱼哥、上司蟹老板等生物展开
场景设定于太平洋海底
一座被称为比奇堡的城市
这部动画除了固定描绘的卡通场景与人物之外
也会穿插一些真实的物件或人物
但海绵宝宝卡通的内容基本上与海洋知识无关
甚至夸大到完全不合乎科学与常识
例如海底生火、海底冲澡等
剧集内容也会时不时的嘲笑精致艺术和章鱼哥的劳工权益想法。
解除文件占用
f.close() #关闭文件对象
time.sleep(5000000) #程序睡眠状态
#如果不调用close,同时程序没有停止运行,那么这个文件一直被python程序占用
with open语法
with open('测试.txt', 'r', encoding='UTF-8') as f:
for line in f:
print(f"每一行数据是:{line}")
# 在操作完成后自动关闭close文件,避免遗忘close方法
每一行数据是:《海绵宝宝》的故事情节主要围绕着主角海绵宝宝和他的好朋友派大星、邻居章鱼哥、上司蟹老板等生物展开
每一行数据是:场景设定于太平洋海底
每一行数据是:一座被称为比奇堡的城市
每一行数据是:这部动画除了固定描绘的卡通场景与人物之外
每一行数据是:也会穿插一些真实的物件或人物
每一行数据是:但海绵宝宝卡通的内容基本上与海洋知识无关
每一行数据是:甚至夸大到完全不合乎科学与常识
每一行数据是:例如海底生火、海底冲澡等
每一行数据是:剧集内容也会时不时的嘲笑精致艺术和章鱼哥的劳工权益想法。
总结
- 操作文件需要通过open函数打开文件得到文件对象
- 文件对象读取方法:read(), readline(), readlines(), for line in 文件对象
- 文件读取完成后,要使用文件对象.close()方法关闭文件对象,否则文件一直被占用
课后练习
统计文本中itheima出现的次数
f = open('word.txt', 'r', encoding='UTF-8')
# 第一种方法:直接读取文档,统计出现次数
content = f.read()
count = content.count("itheima")
print(f"itheima出现次数:{count}")
f.close()
# 第二种方法:一行一行读取文档
all = 0
for line in f:
line = line.strip() # 去除开头和结尾的空格以及换行符
words = line.split(" ") # 按照空格切分单词
count = words.count("itheima")
all = count + all
print(f"itheima出现次数:{all}")
itheima出现次数:6
3 文件的写入
# 1.打开文件
f = open("python.txt", 'w')
# 2.文件写入
f.write('hello world')
# 3.内容刷新
f.flush()
注意:
- 直接调用write内容并没有真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
- 当调用flush的时候,内容会真正写入文件
- 避免频繁的操作硬盘,导致效率下降
# 打开不存在的文件写入数据
f = open("不存在.txt", 'w', encoding='UTF-8')
f.write('比奇堡里有海绵宝宝和派大星,还有章鱼哥,蟹老板和痞老板')
# f.flush()
f.close() # close方法里面内置了flush功能,因此可以直接写close即可
# 打开存在的文件写入数据
f = open("不存在.txt", 'w', encoding='UTF-8')
f.write('海绵宝宝与派大星')
f.close()
# 文件内容只有海绵宝宝与派大星,因为w写入模式会把原先存在的内容全部清理掉
注意事项:
- w模式,文件不存在,会创建新文件保存写入的内容
- w模式,文件存在,会先清空原有文件里的内容,再写入新的数据
- close()方法带有flush()方法的功能
4 文件的追加
# 1.打开文件
f = open("python.txt", 'a')
# 2.文件写入
f.write('hello world')
# 3.内容刷新
f.flush()
注意事项:
- a模式,文件不存在,会创建新文件保存写入的内容
- a模式,文件存在,在文件最后追加写入新内容
- 可以在添加内容前面加入换行符"\n"以换行添加内容
f = open("不存在.txt", 'a', encoding='UTF-8')
f.write(',还有最可爱的姗迪和小蜗牛')
f.close()
比奇堡里有海绵宝宝和派大星,还有章鱼哥,蟹老板和痞老板,还有最可爱的姗迪和小蜗牛
# 换行添加文字内容
f = open("不存在.txt", 'a', encoding='UTF-8')
f.write('\n欢迎来到比奇堡!')
f.close()
比奇堡里有海绵宝宝和派大星,还有章鱼哥,蟹老板和痞老板,还有最可爱的姗迪和小蜗牛
欢迎来到比奇堡!
5 文件操作综合案例
完成对文件备份
- 读取文件
- 将文件写入到bill.txt.bak文件作为备份
- 将文件内标记为测试的数据行丢弃
name,date,money,type,remarks
周杰轮,2022-01-01,100000,消费,正式
周杰轮,2022-01-02,300000,收入,正式
周杰轮,2022-01-03,100000,消费,测试
林俊节,2022-01-01,300000,收入,正式
林俊节,2022-01-02,100000,消费,测试
林俊节,2022-01-03,100000,消费,正式
林俊节,2022-01-04,100000,消费,测试
林俊节,2022-01-05,500000,收入,正式
张学油,2022-01-01,100000,消费,正式
张学油,2022-01-02,500000,收入,正式
张学油,2022-01-03,900000,收入,测试
王力鸿,2022-01-01,500000,消费,正式
王力鸿,2022-01-02,300000,消费,测试
王力鸿,2022-01-03,950000,收入,正式
刘德滑,2022-01-01,300000,消费,测试
刘德滑,2022-01-02,100000,消费,正式
刘德滑,2022-01-03,300000,消费,正式
f = open('bill.txt', 'r', encoding='UTF-8')
f1 = open('bill.txt.bak', 'w', encoding='UTF-8')
for line in f:
line = line.strip()
if '测试' in line:
continue
f1.write(line)
f1.write('\n')
f.close()
f1.close()