python进阶-文件操作
·
一、文件的打开
要操作文件,第一步必须用 open() 函数打开它,获取文件对象(也叫文件句柄),后续所有操作都基于这个对象。
1. 基本语法
file_obj = open(file_path, mode='r', encoding=None)
file_path:文件路径(必填),可以是绝对路径(如C:/test.txt)或相对路径(如./test.txt);mode:打开模式(核心参数),决定你能对文件做什么操作,常用值如下:表格
|
模式 |
含义 |
关键特点 |
|
|
只读(默认模式) |
文件不存在则报错,不能写入 |
|
|
只写 |
文件不存在则创建,存在则清空 |
|
|
追加写 |
文件不存在则创建,新内容加在末尾 |
|
|
读写 |
不创建新文件,文件不存在报错 |
|
|
二进制模式(如 / ) |
用于图片、视频等非文本文件 |
encoding:文件编码(仅文本文件需要),推荐用utf-8,避免中文乱码。
2. 两种打开方式
方式 1:手动打开 + 手动关闭
# 1. 打开文件
f = open("test.txt", "r", encoding="utf-8")
# 2. 操作文件(比如读取)
content = f.read()
# 3. 必须关闭文件!否则会占用系统资源
f.close()
⚠️ 缺点:如果操作文件时抛出异常,close() 可能执行不到,导致文件句柄泄漏。
方式 2:with 语句(推荐,自动关闭)
with 会在代码块执行完后自动关闭文件,即使出错也不例外,是 Python 最佳实践:
with open("test.txt", "r", encoding="utf-8") as f:
content = f.read() # 缩进内操作文件
# 缩进结束后,文件已自动关闭,无需手动close
二、文件的读取操作
拿到文件对象后,有 3 种常用的读取方式,适配不同场景:
1. 一次性读取全部内容(read ())
适合小文件,一次性读入内存:
with open("test.txt", "r", encoding="utf-8") as f:
all_content = f.read() # 读取所有内容,返回字符串
print(all_content)
示例文件 test.txt 内容:
第一行内容
第二行内容
第三行内容
输出:
第一行内容
第二行内容
第三行内容
2. 按行读取(readline ())
适合大文件,每次读一行,节省内存:
with open("test.txt", "r", encoding="utf-8") as f:
line1 = f.readline() # 读第一行(包含换行符\n)
line2 = f.readline() # 读第二行
print("第一行:", line1.strip()) # strip() 去掉换行符
print("第二行:", line2.strip())
输出:
第一行:第一行内容
第二行:第二行内容
3. 读取所有行到列表(readlines ())
把文件每一行作为列表的一个元素,方便遍历:
with open("test.txt", "r", encoding="utf-8") as f:
all_lines = f.readlines() # 返回列表:['第一行内容\n', '第二行内容\n', '第三行内容']
# 遍历每一行
for line in all_lines:
print(line.strip()) # 去掉换行符后打印
输出:
第一行内容
第二行内容
第三行内容
4. 直接遍历文件对象
对文件对象直接用 for 循环,逐行读取,内存效率最高:
with open("test.txt", "r", encoding="utf-8") as f:
for line in f: # 逐行读取,无需提前加载所有内容
print(line.strip())
三、文件的关闭
- 手动关闭:用
file_obj.close(),必须确保执行(比如放在finally块); - 自动关闭:用
with语句,无需手动操作,是工业界标准写法; - 关闭的意义:释放操作系统分配的文件句柄资源,避免资源泄漏(比如文件被占用无法删除)。
四、实战示例:读取大文件
如果文件有 10G 大小,用 read() 一次性读取会直接卡死,正确做法是逐行读取:
# 读取大文件并统计行数
count = 0
with open("big_file.txt", "r", encoding="utf-8") as f:
for line in f:
count += 1
# 可在这里处理每行内容(比如筛选、清洗)
print(f"文件总行数:{count}")
更多推荐


所有评论(0)