一、文件的打开

要操作文件,第一步必须用 open() 函数打开它,获取文件对象(也叫文件句柄),后续所有操作都基于这个对象。

1. 基本语法

file_obj = open(file_path, mode='r', encoding=None)
  • file_path:文件路径(必填),可以是绝对路径(如 C:/test.txt)或相对路径(如 ./test.txt);
  • mode:打开模式(核心参数),决定你能对文件做什么操作,常用值如下:表格

模式

含义

关键特点

r

只读(默认模式)

文件不存在则报错,不能写入

w

只写

文件不存在则创建,存在则清空

a

追加写

文件不存在则创建,新内容加在末尾

r+

读写

不创建新文件,文件不存在报错

b

二进制模式(如 rb

/wb

用于图片、视频等非文本文件

  • 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}")

 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐