从零开始学Python(七):文件操作

从零开始学Python(七):文件操作

本系列教程将带你从零开始学习Python编程,无需任何编程基础。

文件操作基础

在Python中,使用 open() 函数打开文件。基本语法是open(filename, mode),filename是文件名,mode是打开模式。

读取模式’r’用于读取文件,写入模式’w’用于写入文件(会覆盖已有内容),追加模式’a’在文件末尾添加内容,读写模式’r+’可以同时读写,二进制模式’b’用于处理二进制文件。

使用完文件后必须关闭,释放系统资源。推荐使用with语句,它会自动关闭文件,即使发生异常也是如此。

读取文件

read()方法读取整个文件内容,返回一个字符串。readlines()方法读取所有行,返回一个列表,每行是一个元素。逐行读取使用for循环直接遍历文件对象,这种方法推荐用于大文件,不会一次性加载全部内容到内存。

read(size)方法可以读取指定字符数。读取时注意使用strip()方法去除换行符和空白字符。

写入文件

write()方法写入文本,会覆盖已有内容。使用追加模式’a’可以在文件末尾添加内容。writelines()方法可以写入多行,接受一个字符串列表作为参数。

处理CSV文件

CSV(逗号分隔值)是一种常见的文件格式。读取CSV文件时,逐行读取然后按逗号分割即可。写入CSV文件时,将数据组织成列表,每行一个字符串,用逗号连接字段,最后加换行符。

文件异常处理

处理文件时可能会出现各种错误,应该使用异常处理。常见的异常有FileNotFoundError(文件不存在)、PermissionError(没有权限)等。使用try-except语句可以捕获这些异常,提供友好的错误提示。

可以创建安全的文件操作函数,封装异常处理逻辑,使主代码更简洁。

检查文件是否存在

使用os.path模块的exists()函数可以检查文件是否存在。这在读取文件之前很有用,可以避免文件不存在的错误。

实战示例:日志文件分析器

让我们创建一个实用的日志文件分析程序,分析服务器日志文件,统计错误数量、访问量等信息。

创建文件 log_analyzer.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# 日志文件分析器

import os
from datetime import datetime

def create_sample_log(filename):
"""创建示例日志文件"""
log_entries = [
"2025-01-01 10:00:00 INFO 用户登录 - 用户ID:1001",
"2025-01-01 10:01:00 INFO 查看产品 - 产品ID:2001",
"2025-01-01 10:02:00 ERROR 数据库连接失败",
"2025-01-01 10:03:00 INFO 添加到购物车 - 商品ID:3001",
"2025-01-01 10:04:00 WARNING 库存不足 - 商品ID:3001",
"2025-01-01 10:05:00 INFO 用户登录 - 用户ID:1002",
"2025-01-01 10:06:00 ERROR 支付失败 - 订单ID:4001",
"2025-01-01 10:07:00 INFO 完成订单 - 订单ID:4002",
]

with open(filename, "w", encoding="utf-8") as file:
file.write("\n".join(log_entries))

print(f"已创建示例日志文件:{filename}")

def analyze_log(filename):
"""分析日志文件"""
if not os.path.exists(filename):
print(f"错误:文件 {filename} 不存在")
return

# 统计数据
total_lines = 0
info_count = 0
warning_count = 0
error_count = 0

print("\n" + "=" * 60)
print(" 日志文件分析报告")
print("=" * 60)

try:
with open(filename, "r", encoding="utf-8") as file:
print(f"\n文件:{filename}")
print("-" * 60)

for line in file:
total_lines += 1

# 统计日志级别
if "INFO" in line:
info_count += 1
elif "WARNING" in line:
warning_count += 1
print(f"⚠️ 警告:{line.strip()}")
elif "ERROR" in line:
error_count += 1
print(f"❌ 错误:{line.strip()}")

print("-" * 60)
print("\n统计信息:")
print(f" 总行数:{total_lines}")
print(f" INFO:{info_count}")
print(f" WARNING:{warning_count}")
print(f" ERROR:{error_count}")

# 计算错误率
if total_lines > 0:
error_rate = (error_count / total_lines) * 100
print(f" 错误率:{error_rate:.2f}%")

# 健康评估
print("\n健康评估:", end="")
if error_count == 0:
print("✅ 优秀 - 没有错误")
elif error_count <= 2:
print("⚠️ 良好 - 少量错误")
else:
print("❌ 需要关注 - 错误较多")

print("=" * 60)

except Exception as e:
print(f"分析失败:{e}")

def main():
"""主程序"""
log_file = "server.log"

# 创建示例日志文件
create_sample_log(log_file)

# 分析日志文件
analyze_log(log_file)

if __name__ == "__main__":
main()

这个程序使用os.path.exists()检查文件是否存在,使用with语句确保文件正确关闭,逐行读取日志文件统计各类日志的数量,计算错误率并提供健康评估,使用异常处理确保程序健壮性。

常见错误

忘记关闭文件会导致资源泄漏,应该使用with语句自动管理。文件编码问题很常见,处理中文等非ASCII字符时应该指定encoding=’utf-8’。写入模式’w’会覆盖已有文件,如果想追加内容应该使用追加模式’a’。不处理文件异常可能导致程序崩溃,应该使用try-except捕获常见异常。


系列导航