8.1 文件的编码
思考:计算机只能识别:0和1,那么我们丰富的文本文件是如何被计算机识别,并存储在硬盘中呢?
答案:使用编码技术(密码本)将内容翻译成0和1存入。
编码技术即翻译的规则,记录了如何将内容翻译成二进制,以及如何将二进制翻译回可识别内容。计算机中有许多可用编码:UTF-8,GBK,Big5等,不同的编码,将内容翻译成二进制也是不同的。
编码有许多,所以要使用正确的编码,才能对文件进行正确的读写操作呢。UTF-8是目前全球通用的编码格式,除非有特殊需求,否则,一律以UTF-8格式进行文件编码即可。
8.2 文件的读取
1、什么是文件
2、文件操作
在日常生活中,文件操作主要包括打开、关闭、读、写等操作。我们平常对文件的基本操作,大概可以分为三个步骤:打开文件、读写文件、关闭文件。
(1)open()打开函数
mode常用的三种基础访问模式
(2)读操作的相关方法
f = open("D:/测试.txt", 'r', encoding="UTF-8")
content = f.read(10)
print(content) # 这是一个测试文件,这
f = open("D:/测试.txt", 'r', encoding="UTF-8")
content = f.read()
print(content)
# 这是一个测试文件,这是一个测试文件
# 这是一个测试文件,这是一个测试文件
# 这是一个测试文件,这是一个测试文件
# 这是一个测试文件,这是一个测试文件
# 这是一个测试文件,这是一个测试文件
# 这是一个测试文件,这是一个测试文件
# 这是一个测试文件,这是一个测试文件
# 这是一个测试文件,这是一个测试文件
f = open("D:/测试文件.txt", 'r', encoding="UTF-8")
content = f.readlines()
print(f"content的类型是{type(content)}") # content的类型是<class 'list'>
print(content) # ['itheima,itcast\n', '黑马程序员,传智播客']
f = open("D:/测试文件.txt", 'r', encoding="UTF-8")
content = f.read(10)
line1 = f.readline()
line2 = f.readline()
print(content)
print(f"第一行{line1}")
print(f"第二行{line2}")
# 运行结果
# itheima,it
# 第一行cast
# 第二行黑马程序员,传智播客
f = open("D:/测试文件.txt", 'r', encoding="UTF-8")
for line in f:
print(line)
# 运行结果
# itheima,itcast
#
# 黑马程序员,传智播客
(3)关闭文件对象
import time
f = open("D:/测试文件.txt", 'r', encoding="UTF-8")
time.sleep(50000) # 程序睡眠5000秒,未停止运行,此时不能对测试文件.txt进行删除、重命名操作
f.close() # 关闭文件对象
import time
with open("D:/测试文件.txt", 'r', encoding="UTF-8") as f:
content = f.readlines()
print(content) # ['itheima,itcast\n', '黑马程序员,传智播客']
time.sleep(50000) # 尽管程序正在运行,但此时上面代码已自动关闭文件对象,因此可以对文件进行删除和重命名操作
(4)操作汇总
(5)总结
(6)课后练习:单词计数
# 方法一:读取全部内容,通过字符串的count方法统计itheima的单词数量
f = open("D:/word.txt", "r", encoding="UTF-8")
content = f.read()
num = content.count("itheima")
print(f"word.txt文件中itheima出现的次数是{num}次")
# 方法二:读取内容,一行一行读取
f = open("D:/word.txt", "r", encoding="UTF-8")
num = 0
for line in f:
line = line.strip() # 去除后面的换行符,注意千万要再把新得到的字符串赋值给line
list = line.split(" ")
for target in list:
if target == "itheima":
num += 1
print(f"word.txt文件中itheima出现的次数是{num}次")
# 方法三:与方法二原理相同
f = open("D:/word.txt", "r", encoding="UTF-8")
lines = f.readlines()
num = 0
for line in lines:
line = line.strip() # 去除后面的换行符,注意千万要再把新得到的字符串赋值给line
list = line.split(" ")
for target in list:
if target == "itheima":
num += 1
print(f"word.txt文件中itheima出现的次数是{num}次")
8.3 文件的写入
1、写操作快速入门
f1 = open("D:/python.txt", "w", encoding="UTF-8")
f1.write("hello,world")
f1.flush()
import time
f1 = open("D:/python.txt", "w", encoding="UTF-8")
f1.write("hello,world")
# f1.flush()
time.sleep(60) # 程序睡眠60s,此时未停止运行,打开python.txt会发现里面还未写入内容,如果前面写上f1.flush(),则运行到这时,内容已写入到文件
注意:
- 直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
- 当调用flush的时候,内容会真正写入文件
- 这样做是避免频繁的操作硬盘,导致效率下降(攒一堆,一次性写磁盘)
2、写操作注意
- 文件如果不存在,使用"w"模式,会创建新文件
- 文件如果存在,使用"w"模式,会将原有内容清空
3、追加写入操作快速入门
f1 = open("D:/python.txt", "a", encoding="UTF-8")
f1.write("黑马程序员")
f1.write("\n月薪过万")
f1.flush() # 内容刷新
注意:
- a模式,文件不存在会创建文件
- a模式,文件存在会在最后追加写入文件
8.4 文件操作综合案例
# 方法一
f1 = open("D:/bill.txt", "r", encoding="UTF-8")
f2 = open("D:/bill.txt.bak", "w", encoding="UTF-8")
for line in f1:
if line.count("测试"):
continue
else:
f2.write(line)
f1.close()
f2.close()
# 方法二
fr = open("D:/bill.txt", "r", encoding="UTF-8")
fw = open("D:/bill.txt.bak", "w", encoding="UTF-8")
for line in fr:
line = line.strip() # 去除每一行后面的换行符
if line.split(",")[4] == "测试":
continue # 直接跳过下面的操作,进行下一轮循环
fw.write(line)
fw.write("\n") # 由于前面已经去除了换行符,这里每一行后面要写一个换行符
fr.close()
fw.close()