从零开始学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捕获常见异常。
系列导航: