Python学习——文件操作
目录
文件的编码
以什么编码写入就以什么编码读取。UTF-8是目前全球通用的编码格式。
文件的读取
文件的操作步骤:
- 打开文件
- 读写文件
- 关闭文件
open()打开函数
语法:open(name, mode , encoding)
- name : 打开的目标文件名的字符串(可以包含文件所在具体路径)。
- mode : 设置打开文件的模式,包括只读(r)、写入(w,文件原先由内容会删掉重新编辑,没有内容则创建新内容)、追加(a,写到已有内容之后)等。
- encoding:编码格式(推荐UTF-8)。encoding要使用关键字传参,open函数定义的时候encoding并不是在第三位。
读操作相关方法
文件对象.read(num)
# num表示从文件中读取数据的长度(单位是字节),如果没有传入num则表示读取所有数据。当对文件进行两次读取时,第二次读取会在第一次读取的基础上接着读取。
代码示例如下:
# encoding要使用关键字传参,open函数定义的时候encoding并不是在第三位
f = open("E:/测试.txt", "r", encoding="UTF-8")
print(type(f))
# 读取文件——read
print(f"read读取后的结果是:{f.read(10)}")
print(f"read读取全部内容后的结果是:{f.read()}")
运行结果如下:
文件对象.readlines()
# 按照行的形式读取全部数据,返回一个列表值,每一行的数据为该列表的一个元素。同样受前面读取结果(read())的影响,继续读取后续内容。
代码示例如下:
f = open("E:/测试.txt", "r", encoding="UTF-8")
print(type(f))
# 读取文件——read
# print(f"read读取后的结果是:{f.read(10)}")
# print(f"read读取全部内容后的结果是:{f.read()}")
# 读取文件——readlines
lines = f.readlines()
print(f"lines的对象类型是:{type(lines)}")
print(f"结果是:{lines}")
代码演示结果如下:
文件对象.readline()
# 一次读取一行内容
代码示例如下:
# readline
f = open("E:/测试.txt", "r", encoding="UTF-8")
print(type(f))
line1 = f.readline()
line2 = f.readline()
line3 = f.readline()
line4 = f.readline()
print(f"第一行数据是:{line1}")
print(f"第一行数据是:{line2}")
print(f"第一行数据是:{line3}")
print(f"第一行数据是:{line4}")
运行结果如下:
for循环读取文件行
for line in f:
print(f"每一行数据是:{line}")
文件对象.close()
# 关闭文件对象,如果不调用close(),同时程序也没有停止运行,那么这个文件将一直被Python程序占用。
代码示例如下:
没有close(),程序一段时间内也不结束,此时改动txt文件,会提示文件被占用。
with open语法
通过with open 语法打开文件,可以自动关闭。
with open("E:/测试.txt", "r", encoding="UTF-8") as f:
for line in f:
print(f"每一行数据是:{line}")
time.sleep(5000000)
练习:单词计数
通过Windows的文本编辑器软件,将如下内容保存到:word.txt,文件可以存储在任意位置,统计kites出现的次数。
kites have wind
python java c
kites have python
qingdao shandong hanzhou
coffee kites kites
代码示例如下:
# 练习 统计单词kites次数
count = 0 # 用来记录次数
with open("E:/word.txt", "r", encoding="UTF-8") as f:
word = f.read() # 读取文件内的数据给word,字符串类型
# num = word.count("kites") # 直接判断kites有缺陷,如果有kitesa单词,依然会统计进去
# print(f"kites的数量有:{num}")
word = word.replace("\n", " ") # 去除换行符,避免对分割造成影响。不然会有'kites\n'元素,统计不到
my_list = word.split(" ") # 将字符串按照空格分隔,给列表
print(my_list)
for element in my_list: # 遍历列表
if element == "kites": # 列表元素对比
count += 1
print(f"kites出现的次数是:{count}")
文件的写入和追加
写入操作将文件原先的内容覆盖掉重新编辑(第一次写入时),追加操作则是写到已有内容之后,二者都可以创建没有的文件,然后写入。写入操作(w),追加操作(a)。可以通过\n实现换行操作。
f.write() # 内容写入到内存中,并没有写入到硬盘
f.flush() # 内容刷新,将内存中积攒的内容,写入到硬盘的文件中
f.close() # 内置flush功能
注意:避免频繁调用操作硬盘,导致效率下降。
代码示例如下:
# 写操作
import time
f = open("E:/test.txt", "w", encoding="UTF-8")
f.write("Hello World") # 内容写入到内存中,并没有写入到硬盘
# f.flush() # 将内存中积攒的内容,写入到硬盘的文件中
f.close() # 内置flush功能
# 追加操作和写入操作的差距在于mode的不同
f = open("E:/test2.txt", "a", encoding="UTF-8") #没有test文件,自动创建
f.write("\n你好,世界!") # 内容写入到内存中,并没有写入到硬盘
f.flush() # 将内存中积攒的内容,写入到硬盘的文件中
# f.close() # 内置flush功能
综合案例:文件备份
代码示例如下:
# 案例:文件备份
f = open("E:/bill.txt", "r", encoding="UTF-8") # 原文件
f0 = open("E:/bill.txt.bak", "a", encoding="UTF-8") # 备份文件
for line in f:
line = line.strip() # 处理掉换行符
my_list = line.split(",") # 分割成列表
if my_list[-1] == "测试":
continue # 进入下一次循环
else:
f0.write(line)
# 由于前面对line进行了去换行符的操作,需要手动换行
f0.write("\n")
f.close()
f0.close()