一、文件的编码
UTF-8是目前全球通用的编码格式
除非有特殊需求,否则,一律以UTF-8格式进行文件编码即可。
为什么需要使用编码?
计算机只认识0和1,所以需要将内容翻译成0和1才能保存在计算机中。
同时也需要编码, 将计算机保存的0和1,反向翻译回可以识别的内容。
二、文件的读取
- open()打开函数
name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
mode:设置打开文件的模式(访问模式):只读、写入、追加等。
encoding:编码格式(推荐使用UTF-8)
2.read()方法
read()方法:
num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。
由于上面度过了,后面的读会接着往下读
# 读取文件 read() 读取十个字节
print(f'读取10个字节的结果:{f.read(10)}')
# 由于上面已经读取了一次,那么这一次读取会在上一次读取的位置往下进行读取
print(f'读取全部的内容的结果:{f.read()}')
readlines()方法:
readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。
readline()方法
readline()方法:一次读取一行内容
for循环读取文件行
以上这些读的操作都会受到前面读的约束,只要前面读了,后面的读都是接着往下读。
3.close()关闭文件对象
with open语法:操作完后会自动关闭
案例练习
# 打开文件,以读取模式打开
f = open("D:/word.txt", "r", encoding="UTF-8")
# 方式1:读取全部内容,通过字符串count方法统计itheima单词数量
# content = f.read() # 全部都读取出来,得到的字符串
# count = content.count("itheima")
# print(f"itheima在文件中出现了:{count}次")
# 方式2:读取内容,一行一行读取 读取出来每一行也是字符串
count = 0 # 使用count变量来累计itheima出现的次数
for line in f:
line = line.strip() # 去除开头和结尾的空格以及换行符 因为避免出先itheima\n不匹配问题
words = line.split(" ") # 就会变成list
for word in words:
if word == "itheima":
count += 1 # 如果单词是itheima,进行数量的累加加1
# 判断单词出现次数并累计
print(f"itheima出现的次数是:{count}")
# 关闭文件
f.close()
三、文件的写入
1.这里的mode要修改为w,才是写入的操作
p直接调用write,内容并未真正写入文件,而是会积攒在程序的内存中,称之为缓冲区
p当调用flush的时候,内容会真正写入文件
p这样做是避免频繁的操作硬盘,导致效率下降(攒一堆,一次性写磁盘)
2.操作
•wirte(),写入内容
•flush(),刷新内容到硬盘中
3.注意事项:
•w模式,文件不存在,会创建新文件
•w模式,文件存在,会清空原有内容
•close()方法,带有flush()方法的功能,此时可以不用flush()
•再次写入的时候只会覆盖掉前面写的东西
四、文件的追加
而前面的w写入操作则是,当文件存在的时候,清空掉原有的内容。
案例练习
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()
# 一定要定义给一个变量,原始的不修改
# 按照逗号进行分割字符串,变成list
num = line.split(',')
if num[4] == '测试':
continue
fw.write(line)
# 由于前面strip的操作,所以需要手动地写出换行符
fw.write('\n')
fr.close()
fw.close() # 写出文件调用close()会自动flush()