一 文件编码概念
思考:计算机只能识别: 0和1,那么我们丰富的文本文件是如何被计算机识别,并存储在硬盘中呢?
答案:使用编码技术(密码本)将内容翻译成0和1存入。
常见编码有UTF8,gbk等等。不同的编码,将内容翻译成不同的二进制。
二 文件的操作
2.1 open函数
open(namme, mode, encoding)
'''
open作用:创建或者打开一个文件。文件不存在时会创建,存在时则打开。
参数name:要创建或者打开的文件路径。
参数mode:要打开文件的模式。可以是r,w,a,即依次是只读,只写,追加。
参数encoding:以何种编码格式打开文件。
'''
mode常用的三种基础访问模式:
2.2 读操作相关方法
读操作相关方法:主要有read和readlines方法。
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()
结果:
测试: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()
结果:
测试: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()
结果:
for循环读取:
if __name__ == '__main__':
# 打开文件
f = open("测试.txt", "r", encoding="UTF-8")
# 读取文件- readline()
# for循环读取文件行
for line in f:
print(f"每一行数据是:{line}")
f.close()
2.2.2 为什么要关闭文件?
利用with open语句 自动运行close 以免忘写.
if __name__ == '__main__':
# with open 语法操作文件
with open("测试.txt", "r", encoding = "UTF-8") as f:
for line in f:
print(f"每一行数据是: {line}")
2.2.3 文件读操作汇总
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")
2.3 文件的写出操作
注意,上图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,内容:
2.4 文件的追加写入操作
注意,上图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()
结果:
文件不存在时,追加模式(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里面。
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()