一 文件编码概念
思考:计算机只能识别: 0和1,那么我们丰富的文本文件是如何被计算机识别,并存储在硬盘中呢?
答案:使用编码技术(密码本)将内容翻译成0和1存入。
![在这里插入图片描述](https://img-blog.csdnimg.cn/5b531de13df24faca76934b66dba39df.png)
常见编码有UTF8,gbk等等。不同的编码,将内容翻译成不同的二进制。
二 文件的操作
2.1 open函数
open(namme, mode, encoding)
'''
open作用:创建或者打开一个文件。文件不存在时会创建,存在时则打开。
参数name:要创建或者打开的文件路径。
参数mode:要打开文件的模式。可以是r,w,a,即依次是只读,只写,追加。
参数encoding:以何种编码格式打开文件。
'''
![在这里插入图片描述](https://img-blog.csdnimg.cn/94919f7e44ae410798b5617f211e70e0.png)
mode常用的三种基础访问模式:
![在这里插入图片描述](https://img-blog.csdnimg.cn/9318b135dc0145eb980c13be5d3d4d51.png)
2.2 读操作相关方法
读操作相关方法:主要有read和readlines方法。
![在这里插入图片描述](https://img-blog.csdnimg.cn/0fc2b606efeb4b2f8cdede60018d4eef.png)
2.2.1 测试读文件操作
先把以下内容保存到”测试.txt“中。
你是谁,我是预言家,请不要把我投出局
这把游戏我验到3号是狼人,大家请相信我,
一起把3号投出去。
测试:read()。
if __name__ == '__main__':
# 打开文件
f = open("测试.txt", "r", encoding="UTF-8")
# f是一个文件对象
print(type(f)) #<class '_io.TextIOWrapper'>
# 读取文件-read
print(f"读取10个字节的结果:{f.read(10)}")
# 这里讲错了,open创建对象分字符和字节的,以字符方式打开文件时,num表示字符数,否则utf-8里常见汉字一个3byte
print(f"读取10个字节的结果:{f.read(4)}")
print(f"读取10个字节的结果:{f.read()}")
# 关闭文件
f.close()
结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/11369f91c59c40f29f304c98959c40ac.png)
测试:readlines()。
if __name__ == '__main__':
# 打开文件
f = open("测试.txt", "r", encoding="UTF-8")
# 读取文件 - readLines()
lines = f.readlines()
# 读取文件的全部行,封装到列表中
print(f"lines对象的类型: {type(lines)}") #<class 'list'>
print(f"lines对象的内容是: {lines}") #这次就可以了 \n是换行符
# 关闭文件
f.close()
结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/4c4d5f133778494985aa95b00de7ad45.png)
测试:readline()。
if __name__ == '__main__':
# 打开文件
f = open("测试.txt", "r", encoding="UTF-8")
# 读取文件- readline()
line1 = f.readline()
line2 = f.readline()
line3 = f.readline()
print(f"第一行数据是:{line1}")
print(f"第二行数据是:{line2}")
print(f"第三行数据是:{line3}")
f.close()
结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/6b4a6557107a46439356252c4472f9f5.png)
for循环读取:
if __name__ == '__main__':
# 打开文件
f = open("测试.txt", "r", encoding="UTF-8")
# 读取文件- readline()
# for循环读取文件行
for line in f:
print(f"每一行数据是:{line}")
f.close()
![在这里插入图片描述](https://img-blog.csdnimg.cn/c6e69fb1836c4d18b9c9c043eba8e069.png)
2.2.2 为什么要关闭文件?
![在这里插入图片描述](https://img-blog.csdnimg.cn/4913db33e49e475fb3654390874ff32a.png)
利用with open语句 自动运行close 以免忘写.
if __name__ == '__main__':
# with open 语法操作文件
with open("测试.txt", "r", encoding = "UTF-8") as f:
for line in f:
print(f"每一行数据是: {line}")
![在这里插入图片描述](https://img-blog.csdnimg.cn/615b6ca2a3fd4e23a126633b844e6be8.png)
2.2.3 文件读操作汇总
![在这里插入图片描述](https://img-blog.csdnimg.cn/c7ae6719d8914b39ac600afcc9bbcefc.png)
2.2.4 文件读取练习-统计文件中某个单次的出现个数
在”word.txt“输入内容:
guangzhou shenzhen jiangmen
suzhou hangzhou wuhan
hanzhou guangzhou ningbo
guangzhou changshan xiamen
我们统计guangzhou的单次出现个数。
if __name__ == '__main__':
f = open("word.txt", "r", encoding="UTF-8")
nums = 0
for line in f:
nums += line.count("guangzhou")
print("里面有 ", nums, " 个guangzhou")
![在这里插入图片描述](https://img-blog.csdnimg.cn/ebb4cb80673140eb9071b5e85c67cde7.png)
2.3 文件的写出操作
![在这里插入图片描述](https://img-blog.csdnimg.cn/5fd1b77d77ed4dbc84309c349d2a4de7.png)
注意,上图f.flush()之后仍要f.close()关闭文件。
并且,如果文件存在,将会把文件内部的内容清空,在文件开头重新写入。
if __name__ == '__main__':
f = open("123.txt", "w", encoding="UTF-8")#当文件不存在时。它会给我自动创建
# write写入
f.write("Helloworld!")
# flush刷新
f.flush()
# close内置了flush的功能,所以当内容不急着写入磁盘时,可以不调用flush,让close()进行处理.
f.close()
得到123.txt,内容:
![在这里插入图片描述](https://img-blog.csdnimg.cn/c99f868f327e409388c5fbbc4b5a1a19.png)
2.4 文件的追加写入操作
![在这里插入图片描述](https://img-blog.csdnimg.cn/438dd932750d44bf97cd2ee935530cbf.png)
注意,上图f.flush()之后仍要f.close()关闭文件。
if __name__ == '__main__':
f = open("123.txt", "a", encoding="UTF-8")#当文件不存在时。它会给我自动创建
# write写入
f.write("我是追加的内容")
# flush刷新
f.flush()
# close内置了flush的功能
f.close()
结果:
![在这里插入图片描述](https://img-blog.csdnimg.cn/a6353308341f43a6ad8bedcecc23a1f0.png)
文件不存在时,追加模式(a)同样自动创建文件,这里就不演示了。
2.5 文件的综合案例
有一份账单文件,记录了消费收入的具体记录,内容如下:
name,date,type,remarks
周杰轮,2022-01-01,100000,消费,正式
周杰轮,2022-01-02,300000,收入,正式
周杰轮,2022-01-03,100000,消费,测试
林俊节,2022-01-01,100000,收入,正式
林俊节,2022-01-02,100000,消费,测试
林俊节,2022-01-03,100000,消费,正式
刘德滑,2022-01-01,100000,消费,正式
刘德滑,2022-01-02,100000,消费,测试
刘德滑,2022-01-03,100000,消费,正式
先将上面账单内容保存到文件bill.txt。
需求(下图的需求可能有点不清晰,这里整理一下表达):将bill.txt的内容备份到bill.txt.bak,并且备份的时候,我们把测试的内容丢弃,不能写入到bill.txt.bak里面。
![在这里插入图片描述](https://img-blog.csdnimg.cn/3f367faac29a473c9d05c743d984dc91.png)
if __name__ == '__main__':
f = open("bill.txt", "r", encoding="UTF-8")
fw = open("bill.txt.bak", "a", encoding="UTF-8")
for line in f:
line = line.strip()# 去掉开头结尾的换行符
split_list = line.split(",")
if split_list[-1] == "测试":
continue
fw.write(line)
fw.write("\n")# 补上换行符,因为上面line.strip()去掉了.
# 关闭文件
f.close()
fw.close()
![在这里插入图片描述](https://img-blog.csdnimg.cn/feaa7eac40014d6d8edb6eb34eae9c52.png)