412 lines
14 KiB
Python
412 lines
14 KiB
Python
# 概述
|
||
# Python 提供了丰富的内置函数和方法来处理文件,支持文本文件、二进制文件、CSV、JSON 等多种格式的读写操作。掌握文件操作是 Python 编程的重要技能。
|
||
|
||
# 2.核心概念
|
||
# 文件对象:通过 open() 函数创建,用于文件读写操作
|
||
# 文件模式:指定文件的打开方式(读取、写入、追加等)
|
||
# 编码:处理文本文件时指定字符编码,避免乱码
|
||
# 上下文管理:使用 with 语句自动管理文件资源
|
||
|
||
# 打开文件
|
||
# 3.1.基本语法
|
||
# 使用 open() 函数打开文件,返回文件对象用于后续操作:
|
||
# file = open(file, mode='r', encoding=None)
|
||
# 参数说明:
|
||
# file:文件路径(字符串),可以是相对路径或绝对路径
|
||
# mode:打开模式(字符串),默认为 'r'(只读)
|
||
# encoding:字符编码(字符串),文本文件推荐使用 'utf-8'
|
||
# 模式 描述 说明
|
||
# 'r' 只读(默认) 文件必须存在,否则报错
|
||
# 'w' 写入 覆盖已有文件,不存在则创建
|
||
# 'a' 追加 在文件末尾添加内容,不存在则创建
|
||
# 'x' 创建 创建新文件,已存在则失败
|
||
# 'b' 二进制 与上述模式组合使用(如 'rb', 'wb')
|
||
# 't' 文本(默认) 文本模式,处理字符串
|
||
# '+' 读写 与上述模式组合使用(如 'r+', 'w+')
|
||
# 只读模式打开文本文件
|
||
file = open("data.txt", "r", encoding="utf-8")
|
||
|
||
# 写入模式打开文件
|
||
file = open("output.txt", "w", encoding="utf-8")
|
||
|
||
# 二进制模式打开文件
|
||
file = open("image.png", "rb")
|
||
|
||
# 4.重要注意事项
|
||
# 文件关闭:操作完成后必须关闭文件,避免资源泄露
|
||
# 编码指定:处理中文等非ASCII字符时务必指定编码
|
||
# 异常处理:文件不存在或权限不足时会抛出异常
|
||
# 推荐使用 with 语句:自动管理文件资源,更安全可靠
|
||
|
||
# 4.读取文件内容
|
||
# 4.1.读取方法概述
|
||
# Python 提供了多种读取文件内容的方法:
|
||
# 方法 描述 适用场景
|
||
# read() 读取整个文件 小文件,需要完整内容
|
||
# readline() 读取一行 逐行处理,大文件
|
||
# readlines() 读取所有行到列表 需要随机访问行
|
||
# for line in file 遍历文件对象 推荐方式,简洁高效
|
||
# 重要注意事项
|
||
# 使用 with 语句:自动管理文件资源,避免泄露
|
||
# 大文件处理:建议逐行读取,避免内存溢出
|
||
# 编码指定:处理中文时务必指定 encoding='utf-8'
|
||
# 异常处理:文件不存在或权限不足时会抛出异常
|
||
|
||
# 读取整个文件
|
||
# 读取整个文件内容
|
||
with open("example.txt", "r", encoding="utf-8") as file:
|
||
content = file.read()
|
||
print(content)
|
||
# 适用场景:
|
||
|
||
# 文件较小,可以一次性加载到内存
|
||
# 需要完整的文件内容进行处理
|
||
# 配置文件、小文本文件等
|
||
|
||
# 逐行读取
|
||
# 逐行读取适合处理大文件或需要按行处理内容的场景
|
||
|
||
# 方法1:使用 readline()
|
||
# 使用 readline() 逐行读取
|
||
# with open("example.txt", "r", encoding="utf-8") as file:
|
||
# line = file.readline()
|
||
# while line:
|
||
# print(line.strip())
|
||
# line = file.readline()
|
||
|
||
# 方法2:使用 readlines()
|
||
# 使用 readlines() 读取所有行
|
||
with open("example.txt", "r", encoding="utf-8") as file:
|
||
lines = file.readlines()
|
||
for line in lines:
|
||
print(line.strip())
|
||
|
||
# 方法3:直接遍历文件对象(推荐)
|
||
# 直接遍历文件对象(推荐方式)
|
||
# with open("example.txt", "r", encoding="utf-8") as file:
|
||
# for line in file:
|
||
# print(line.strip())
|
||
# 方法对比:
|
||
|
||
# 方法 优点 缺点 适用场景
|
||
# readline() 内存效率高 代码较复杂 大文件逐行处理
|
||
# readlines() 代码简洁 内存占用大 小文件,需要随机访问
|
||
# for line in file 代码最简洁,效率高 - 推荐使用
|
||
|
||
# 读取指定字节数
|
||
# 使用 read(size) 方法可以读取指定数量的字符或字节。
|
||
# 基本用法
|
||
# 读取前100个字符
|
||
with open("example.txt", "r", encoding="utf-8") as file:
|
||
chunk = file.read(100)
|
||
print(chunk)
|
||
# 分块读取大文件
|
||
# 分块读取大文件
|
||
with open("large_file.txt", "r", encoding="utf-8") as file:
|
||
while True:
|
||
chunk = file.read(1000) # 每次读取1000个字符
|
||
if not chunk: # 读取结束
|
||
break
|
||
print(chunk)
|
||
# 二进制文件读取
|
||
# 读取二进制文件
|
||
with open("image.jpg", "rb") as file:
|
||
chunk = file.read(1024) # 读取1024字节
|
||
print(chunk)
|
||
# 重要说明:
|
||
# 文本模式:size 参数表示字符数
|
||
# 二进制模式:size 参数表示字节数
|
||
# 适合处理大文件,避免内存溢出
|
||
# 结合循环可以实现流式处理
|
||
|
||
|
||
# 写入文件
|
||
# 方法 描述 特点
|
||
# write() 写入字符串 不自动换行,需要手动添加 \n
|
||
# writelines() 写入字符串序列 不自动换行,需要序列中自带 \n
|
||
# 写入模式
|
||
# 覆盖写入('w'):清空原内容,重新写入
|
||
# 追加写入('a'):在文件末尾添加内容
|
||
# 创建写入('x'):创建新文件,已存在则失败
|
||
# 5.3.重要注意事项
|
||
# 使用 with 语句:自动管理文件资源,避免数据丢失
|
||
# 编码指定:处理中文时务必指定 encoding='utf-8'
|
||
# 换行符:写入方法不会自动添加换行符,需要手动添加
|
||
# 异常处理:权限不足或磁盘空间不够时会抛出异常
|
||
|
||
# 写入字符串
|
||
# 单独写入字符串
|
||
# 覆盖写入模式
|
||
with open("output.txt", "w", encoding="utf-8") as file:
|
||
file.write("Hello, World!\n")
|
||
file.write("This is a new line.\n")
|
||
|
||
# 追加写入模式
|
||
with open("output.txt", "a", encoding="utf-8") as file:
|
||
file.write("This line is appended.\n")
|
||
|
||
# 批量写入字符串
|
||
# 准备要写入的字符串列表
|
||
lines = ["Line 1\n", "Line 2\n", "Line 3\n"]
|
||
|
||
# 使用 writelines() 批量写入
|
||
with open("output.txt", "w", encoding="utf-8") as file:
|
||
file.writelines(lines)
|
||
|
||
# 或者使用循环写入
|
||
with open("output.txt", "w", encoding="utf-8") as file:
|
||
for line in lines:
|
||
file.write(line)
|
||
|
||
# 写入要点:
|
||
# 写入方法不会自动添加换行符
|
||
# 需要手动在字符串末尾添加 \n
|
||
# 使用 with 语句确保文件正确关闭
|
||
# 指定编码避免中文乱码
|
||
|
||
|
||
# 使用 with 语句(推荐)
|
||
# 基本用法
|
||
# with 语句是 Python 推荐的文件操作方式,可以自动管理文件资源:
|
||
# 使用 with 语句自动管理文件资源
|
||
with open("example.txt", "r", encoding="utf-8") as file:
|
||
content = file.read()
|
||
print(content)
|
||
# 文件会自动关闭,无需手动调用 file.close()
|
||
# 优势
|
||
# 自动关闭:无论是否发生异常,文件都会被正确关闭
|
||
# 代码简洁:无需手动管理文件资源
|
||
# 异常安全:即使发生异常也能确保资源释放
|
||
# 推荐使用:Python 官方推荐的文件操作方式
|
||
|
||
# 对比传统方式
|
||
# 传统方式(不推荐)
|
||
file = open("example.txt", "r", encoding="utf-8")
|
||
try:
|
||
content = file.read()
|
||
print(content)
|
||
finally:
|
||
file.close() # 必须手动关闭
|
||
|
||
# with 语句(推荐)
|
||
with open("example.txt", "r", encoding="utf-8") as file:
|
||
content = file.read()
|
||
print(content)
|
||
# 自动关闭,更简洁安全
|
||
|
||
# 文件位置操作
|
||
# 获取当前位置
|
||
# 使用 tell() 方法获取文件指针的当前位置:
|
||
with open("example.txt", "r", encoding="utf-8") as file:
|
||
print(f"初始位置: {file.tell()}") # 0
|
||
content = file.read(5)
|
||
print(f"读取后位置: {file.tell()}") # 5
|
||
|
||
# 移动文件指针
|
||
# 使用 seek() 方法移动文件指针到指定位置:
|
||
with open("example.txt", "rb") as file:
|
||
# 移动到文件开头
|
||
file.seek(0)
|
||
print(f"位置: {file.tell()}") # 0
|
||
|
||
# 移动到第10个字节
|
||
file.seek(10)
|
||
print(f"位置: {file.tell()}") # 10
|
||
|
||
# 从当前位置向后移动5个字节
|
||
file.seek(5, 1)
|
||
print(f"位置: {file.tell()}") # 15
|
||
|
||
# 从文件末尾向前移动10个字节
|
||
file.seek(-10, 2)
|
||
print(f"位置: {file.tell()}") # 文件大小-10
|
||
|
||
# seek() 参数说明
|
||
# offset:偏移量(字节为单位)
|
||
# whence:相对位置
|
||
# 0:从文件开头计算(默认)
|
||
# 1:从当前位置计算
|
||
# 2:从文件末尾计算
|
||
|
||
# 重要注意事项
|
||
# 文本模式:seek() 行为可能受编码影响,建议使用二进制模式
|
||
# 二进制模式:seek() 行为更可预测,适合精确定位
|
||
# 应用场景:断点续传、日志处理、大文件分块处理
|
||
|
||
# 文件属性检查
|
||
# 基本属性检查
|
||
# 使用 os.path 模块检查文件的基本属性:
|
||
import os
|
||
|
||
# 检查文件是否存在
|
||
if os.path.exists("demo.txt"):
|
||
print("文件存在")
|
||
else:
|
||
print("文件不存在")
|
||
|
||
# 判断是文件还是目录
|
||
if os.path.isfile("demo.txt"):
|
||
print("是文件")
|
||
if os.path.isdir("test_folder"):
|
||
print("是目录")
|
||
|
||
# 获取文件大小
|
||
size = os.path.getsize("demo.txt")
|
||
print(f"文件大小: {size} 字节")
|
||
|
||
# 详细属性信息
|
||
# 使用 os.stat() 获取文件的详细信息:
|
||
import os
|
||
from datetime import datetime
|
||
|
||
# 获取文件详细信息
|
||
info = os.stat("demo.txt")
|
||
|
||
print(f"文件大小: {info.st_size} 字节")
|
||
print(f"创建时间: {datetime.fromtimestamp(info.st_ctime)}")
|
||
print(f"最后访问: {datetime.fromtimestamp(info.st_atime)}")
|
||
print(f"最后修改: {datetime.fromtimestamp(info.st_mtime)}")
|
||
print(f"文件权限: {oct(info.st_mode)}")
|
||
|
||
|
||
# 常用属性检查方法
|
||
# 方法 描述 返回值
|
||
# os.path.exists() 检查路径是否存在 True/False
|
||
# os.path.isfile() 检查是否为文件 True/False
|
||
# os.path.isdir() 检查是否为目录 True/False
|
||
# os.path.getsize() 获取文件大小 字节数
|
||
# os.stat() 获取详细信息 stat_result 对象
|
||
|
||
|
||
# 完整实例
|
||
# 1. 创建并写入文件
|
||
with open("demo.txt", "w", encoding="utf-8") as file:
|
||
file.write("这是第一行\n")
|
||
file.write("这是第二行\n")
|
||
file.write("这是第三行\n")
|
||
|
||
# 2. 读取并显示文件内容
|
||
print("文件内容:")
|
||
with open("demo.txt", "r", encoding="utf-8") as file:
|
||
for line_num, line in enumerate(file, 1):
|
||
print(f"第{line_num}行: {line.strip()}")
|
||
|
||
# 3. 追加内容到文件
|
||
with open("demo.txt", "a", encoding="utf-8") as file:
|
||
file.write("这是追加的内容\n")
|
||
|
||
# 4. 显示追加后的内容
|
||
print("\n追加后的内容:")
|
||
with open("demo.txt", "r", encoding="utf-8") as file:
|
||
print(file.read())
|
||
|
||
|
||
# 处理不同类型的文件
|
||
# CSV 文件
|
||
# CSV(逗号分隔值)文件是常见的表格数据格式,适合数据交换和存储。
|
||
# CSV 文件格式示例
|
||
# 姓名, 年龄, 城市
|
||
# 张三, 25, 北京
|
||
# 李四, 30, 上海
|
||
|
||
# 读写 CSV 文件
|
||
# import csv
|
||
|
||
# # 写入 CSV 文件
|
||
# with open("data.csv", "w", newline="", encoding="utf-8") as file:
|
||
# writer = csv.writer(file)
|
||
# writer.writerow(["姓名", "年龄", "城市"]) # 写入表头
|
||
# writer.writerow(["张三", "25", "北京"]) # 写入数据
|
||
# writer.writerow(["李四", "30", "上海"])
|
||
|
||
# # 读取 CSV 文件
|
||
# with open("data.csv", "r", newline="", encoding="utf-8") as file:
|
||
# reader = csv.reader(file)
|
||
# for row in reader:
|
||
# print(row)
|
||
# CSV 文件特点
|
||
# 格式简单:逗号分隔字段,换行分隔记录
|
||
# 兼容性好:Excel、数据库等广泛支持
|
||
# 易于处理:Python csv 模块提供便捷操作
|
||
# 注意编码:处理中文时务必指定 utf-8 编码
|
||
|
||
# SON 文件
|
||
# JSON(JavaScript 对象表示法)是轻量级的数据交换格式,广泛用于数据存储和传输。
|
||
# JSON 文件特点
|
||
# 格式简洁:易于阅读和编写
|
||
# 跨平台:支持多种编程语言
|
||
# 结构化:支持复杂的数据结构
|
||
# 广泛应用:网络通信、配置文件等
|
||
# 读取JSON文件
|
||
import json
|
||
|
||
# 准备数据
|
||
data = {"name": "张三", "age": 25, "cities": ["北京", "上海", "广州"]}
|
||
|
||
# 写入 JSON 文件
|
||
with open("data.json", "w", encoding="utf-8") as file:
|
||
json.dump(data, file, ensure_ascii=False, indent=4)
|
||
|
||
# 读取 JSON 文件
|
||
with open("data.json", "r", encoding="utf-8") as file:
|
||
loaded_data = json.load(file)
|
||
print(loaded_data)
|
||
# JSON 文件优势
|
||
# 数据完整性:保持 Python 对象的完整结构
|
||
# 可读性强:格式化后易于阅读和调试
|
||
# 兼容性好:与 Web API 和数据库无缝对接
|
||
# 类型安全:自动处理数据类型转换
|
||
|
||
# 错误处理
|
||
# 11.1.常见文件操作异常
|
||
# 文件操作中可能遇到的各种异常
|
||
# 异常类型 描述 常见原因
|
||
# FileNotFoundError 文件不存在 路径错误、文件被删除
|
||
# PermissionError 权限不足 文件被占用、无写入权限
|
||
# IOError 输入输出错误 磁盘空间不足、设备错误
|
||
# UnicodeDecodeError 编码错误 文件编码与指定编码不匹配
|
||
|
||
# 异常处理示例
|
||
try:
|
||
with open("nonexistent.txt", "r", encoding="utf-8") as file:
|
||
content = file.read()
|
||
print(content)
|
||
except FileNotFoundError:
|
||
print("文件不存在!")
|
||
except PermissionError:
|
||
print("权限不足,无法访问文件!")
|
||
except IOError as e:
|
||
print(f"文件操作错误: {e}")
|
||
except UnicodeDecodeError:
|
||
print("文件编码错误!")
|
||
finally:
|
||
print("文件操作完成")
|
||
|
||
|
||
# 错误处理最佳实践
|
||
# 具体异常:捕获具体的异常类型,避免使用过于宽泛的 except
|
||
# 异常信息:提供有意义的错误信息,便于调试
|
||
# 资源清理:使用 with 语句自动管理资源
|
||
# 日志记录:记录异常信息,便于问题排查
|
||
# 用户友好:向用户提供清晰的错误提示
|
||
|
||
# 12.最佳实践
|
||
# 12.1.文件操作原则
|
||
# 使用 with 语句:自动管理文件资源,确保正确关闭
|
||
# 指定编码:处理中文等非ASCII字符时务必指定 utf-8
|
||
# 异常处理:捕获并处理文件操作异常,提高程序健壮性
|
||
# 选择合适模式:根据需求选择读取、写入或追加模式
|
||
# 考虑文件大小:大文件使用分块读取,避免内存溢出
|
||
|
||
# 12.2.性能优化建议
|
||
# 大文件处理:使用生成器或分块读取
|
||
# 批量操作:使用 writelines() 批量写入
|
||
# 内存管理:及时释放不需要的文件对象
|
||
# 缓存策略:合理使用文件缓存提高性能
|
||
|
||
# 12.3.安全注意事项
|
||
# 路径验证:检查文件路径的有效性
|
||
# 权限检查:确保有足够的文件操作权限
|
||
# 资源清理:使用 with 语句确保资源释放
|
||
# 异常处理:妥善处理各种异常情况
|