Python系列课(7)——文件操作
·
目录
一、文件的编码
编码:将内容翻译成二进制,以及将二进制翻译回可识别内容的规则。
常用编码:
-
UTF-8:全球通用,推荐使用
-
GBK:中文编码
-
Big5:繁体中文编码
# 查看文件编码方式
# 在Windows记事本中打开文件 -> 另存为 -> 查看编码
# 打开文件时指定编码
f = open("test.txt", "r", encoding="UTF-8")
二、文件的读取
1. open() 打开函数
语法:
open(name, mode, encoding)
| 参数 | 说明 |
|---|---|
name |
文件名(可包含路径) |
mode |
打开模式 |
encoding |
编码格式(推荐UTF-8) |
2. 三种基础访问模式
| 模式 | 说明 |
|---|---|
r |
只读模式 |
w |
写入模式(会清空原有内容) |
a |
追加模式 |
3. 文件读取方法
假设有一个文件 test.txt,内容如下:
hello world abcdefg aaa bbb ccc
# 1. read() - 读取指定字节数
f = open("test.txt", "r", encoding="UTF-8")
content = f.read(5) # 读取5个字节
print(content) # hello
f.close()
# 2. read() - 读取全部内容
f = open("test.txt", "r", encoding="UTF-8")
content = f.read()
print(content)
# hello world
# abcdefg
# aaa
# bbb
# ccc
f.close()
# 3. readlines() - 按行读取,返回列表
f = open("test.txt", "r", encoding="UTF-8")
lines = f.readlines()
print(lines) # ['hello world\n', 'abcdefg\n', 'aaa\n', 'bbb\n', 'ccc']
f.close()
# 4. readline() - 一次读取一行
f = open("test.txt", "r", encoding="UTF-8")
line1 = f.readline()
line2 = f.readline()
line3 = f.readline()
print(f"第一行:{line1}") # 第一行:hello world
print(f"第二行:{line2}") # 第二行:abcdefg
print(f"第三行:{line3}") # 第三行:aaa
f.close()
# 5. for循环读取(推荐)
f = open("test.txt", "r", encoding="UTF-8")
for line in f:
print(line, end="") # 逐行打印,end=""避免重复换行
f.close()
4. close() 关闭文件
f = open("test.txt", "r", encoding="UTF-8")
content = f.read()
print(content)
f.close() # 必须关闭,否则文件一直被占用
5. with open 语法(推荐)
自动关闭文件,不需要手动调用 close()
# 使用with open,自动关闭文件
with open("test.txt", "r", encoding="UTF-8") as f:
content = f.read()
print(content)
# 离开with代码块后,文件自动关闭
# 逐行读取
with open("test.txt", "r", encoding="UTF-8") as f:
for line in f:
print(line, end="")
练习:单词计数
统计 word.txt 中 "itheima" 出现的次数
# 准备文件内容
file_content = """itheima itcast python
itheima python itcast
beijing shanghai itheima
shenzhen guangzhou itheima
wuhan hangzhou itheima
zhengzhou bigdata itheima"""
# 写入文件(模拟已有文件)
with open("word.txt", "w", encoding="UTF-8") as f:
f.write(file_content)
# 统计单词次数
count = 0
with open("word.txt", "r", encoding="UTF-8") as f:
for line in f:
# 方法1:使用count
count += line.count("itheima")
# 方法2:使用split分割后统计
# words = line.split()
# count += words.count("itheima")
print(f"itheima出现的次数:{count}") # itheima出现的次数:6
三、文件的写入
1. 写入模式(w)
-
文件不存在 → 创建新文件
-
文件存在 → 清空原有内容后写入
# 1. 基本写入
f = open("write.txt", "w", encoding="UTF-8")
f.write("hello world")
f.flush() # 刷新内容到硬盘
f.close() # close自带flush功能
# 2. 写入多行
f = open("write.txt", "w", encoding="UTF-8")
f.write("第一行\n")
f.write("第二行\n")
f.write("第三行")
f.close()
# 查看结果
with open("write.txt", "r", encoding="UTF-8") as f:
print(f.read())
# 输出:
# 第一行
# 第二行
# 第三行
2. write() 和 flush()
-
write():将内容写入缓冲区(内存),不直接写入硬盘 -
flush():将缓冲区内容刷新到硬盘 -
close():自带flush()功能
# 演示缓冲区
f = open("buffer.txt", "w", encoding="UTF-8")
f.write("这行还没有写入硬盘")
# 此时查看文件,内容为空
f.flush()
# 此时内容已写入硬盘
f.close()
3. 注意事项
# w模式会清空原有内容
# 执行前 write.txt 内容为 "原有内容"
f = open("write.txt", "w", encoding="UTF-8")
f.write("新内容")
f.close()
# 执行后 write.txt 内容为 "新内容"(原有内容被清空)
四、文件的追加
追加模式(a)
-
文件不存在 → 创建新文件
-
文件存在 → 在末尾追加内容
# 1. 追加写入
f = open("append.txt", "a", encoding="UTF-8")
f.write("第一行追加内容\n")
f.write("第二行追加内容")
f.close()
# 2. 多次追加
with open("append.txt", "a", encoding="UTF-8") as f:
f.write("第三次追加\n")
f.write("第四次追加")
# 查看结果
with open("append.txt", "r", encoding="UTF-8") as f:
print(f.read())
写入换行
# 使用 \n 换行
with open("lines.txt", "w", encoding="UTF-8") as f:
f.write("第一行\n")
f.write("第二行\n")
f.write("第三行\n")
# 结果:
# 第一行
# 第二行
# 第三行
五、文件操作综合案例
需求:文件备份 + 过滤测试数据
原始文件 bill.txt 内容:
name,date,money,type,remarks 周杰轮,2022-01-01,100000,消费,正式 周杰轮,2022-01-02,300000,收入,正式 周杰轮,2022-01-03,100000,消费,测试 林俊节,2022-01-01,300000,收入,正式 林俊节,2022-01-02,100000,消费,测试 林俊节,2022-01-03,100000,消费,正式 林俊节,2022-01-04,100000,消费,测试 林俊节,2022-01-05,500000,收入,正式 张学油,2022-01-01,100000,消费,正式 张学油,2022-01-02,500000,收入,正式 张学油,2022-01-03,900000,收入,测试 王力鸿,2022-01-01,500000,消费,正式 王力鸿,2022-01-02,300000,消费,测试 王力鸿,2022-01-03,950000,收入,正式 刘德滑,2022-01-01,300000,消费,测试 刘德滑,2022-01-02,100000,消费,正式 刘德滑,2022-01-03,300000,消费,正式
需求:
-
读取
bill.txt文件 -
将内容写入
bill.txt.bak作为备份 -
过滤掉
remarks列为 "测试" 的数据行
# 创建原始文件
bill_content = """name,date,money,type,remarks
周杰轮,2022-01-01,100000,消费,正式
周杰轮,2022-01-02,300000,收入,正式
周杰轮,2022-01-03,100000,消费,测试
林俊节,2022-01-01,300000,收入,正式
林俊节,2022-01-02,100000,消费,测试
林俊节,2022-01-03,100000,消费,正式
林俊节,2022-01-04,100000,消费,测试
林俊节,2022-01-05,500000,收入,正式
张学油,2022-01-01,100000,消费,正式
张学油,2022-01-02,500000,收入,正式
张学油,2022-01-03,900000,收入,测试
王力鸿,2022-01-01,500000,消费,正式
王力鸿,2022-01-02,300000,消费,测试
王力鸿,2022-01-03,950000,收入,正式
刘德滑,2022-01-01,300000,消费,测试
刘德滑,2022-01-02,100000,消费,正式
刘德滑,2022-01-03,300000,消费,正式"""
with open("bill.txt", "w", encoding="UTF-8") as f:
f.write(bill_content)
# 文件备份和过滤
with open("bill.txt", "r", encoding="UTF-8") as read_f:
with open("bill.txt.bak", "w", encoding="UTF-8") as write_f:
for line in read_f:
# 检查是否是测试数据(最后一列是"测试")
if line.strip() and line.split(",")[-1].strip() == "测试":
continue # 跳过测试数据
write_f.write(line)
print("备份完成,已过滤测试数据")
# 查看备份文件内容
print("\n备份文件内容:")
with open("bill.txt.bak", "r", encoding="UTF-8") as f:
print(f.read())
输出:
备份完成,已过滤测试数据 备份文件内容: name,date,money,type,remarks 周杰轮,2022-01-01,100000,消费,正式 周杰轮,2022-01-02,300000,收入,正式 林俊节,2022-01-01,300000,收入,正式 林俊节,2022-01-03,100000,消费,正式 林俊节,2022-01-05,500000,收入,正式 张学油,2022-01-01,100000,消费,正式 张学油,2022-01-02,500000,收入,正式 王力鸿,2022-01-01,500000,消费,正式 王力鸿,2022-01-03,950000,收入,正式 刘德滑,2022-01-02,100000,消费,正式 刘德滑,2022-01-03,300000,消费,正式
六、文件操作速查表
1. 打开模式
| 模式 | 说明 | 文件不存在 | 文件存在 |
|---|---|---|---|
r |
只读 | 报错 | 正常读取 |
w |
写入 | 创建 | 清空后写入 |
a |
追加 | 创建 | 末尾追加 |
2. 常用方法
| 方法 | 说明 |
|---|---|
read() |
读取全部或指定字节 |
readline() |
读取一行 |
readlines() |
读取所有行,返回列表 |
write() |
写入内容 |
flush() |
刷新缓冲区 |
close() |
关闭文件 |
3. 推荐写法
# 方式1:with open(自动关闭)
with open("file.txt", "r", encoding="UTF-8") as f:
content = f.read()
# 方式2:传统写法(需要手动关闭)
f = open("file.txt", "r", encoding="UTF-8")
content = f.read()
f.close()
4. 注意事项
# 1. 编码问题:始终指定encoding="UTF-8"
f = open("file.txt", "r", encoding="UTF-8")
# 2. 文件路径
# 同级目录:直接写文件名
# 相对路径:./folder/file.txt
# 绝对路径:C:/Users/name/file.txt
# 3. 换行符:使用 \n
f.write("第一行\n第二行\n")
# 4. 关闭文件:with open 自动处理
# 5. 读取大文件:逐行读取,不要一次性读取全部更多推荐

所有评论(0)