pin_drop当前位置:知识文库 ❯ 图文

Python open函数 - 文件打开读写操作

一、open()函数简介

open() 是Python中用于打开文件的核心内置函数。它返回一个文件对象(file object),通过这个对象可以读取或写入文件内容。掌握open()的正确用法是Python文件操作的基础。

代码示例

# open()函数基本语法
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

最常用的参数包括:file(文件路径)、mode(打开模式)和 encoding(编码方式)。

二、文件打开模式详解

mode参数决定了文件的打开方式,包括读取、写入、追加等。以下是完整的模式对照表:

示例1:基本模式使用

代码示例

# r模式 - 只读(默认)
with open("example.txt", "r") as f:
    content = f.read()
    print(content)

# w模式 - 写入(覆盖)
with open("output.txt", "w") as f:
    f.write("Hello, World!\n")
    f.write("这是第二行\n")

# a模式 - 追加
with open("output.txt", "a") as f:
    f.write("这是追加的内容\n")

示例2:二进制模式和组合模式

代码示例

# rb模式 - 读取二进制文件
with open("image.png", "rb") as f:
    data = f.read()
    print(f"文件大小: {len(data)} 字节")

# wb模式 - 写入二进制文件
with open("copy.png", "wb") as f:
    f.write(data)

# r+模式 - 读写模式
with open("data.txt", "r+") as f:
    content = f.read()
    f.write("\n新添加的内容")

三、编码参数encoding

encoding 参数用于指定文件的编码方式。在Python 3中,文本模式打开文件时必须正确处理编码,否则可能出现乱码或 UnicodeDecodeError

示例1:使用UTF-8编码

代码示例

# 推荐:始终指定UTF-8编码
with open("chinese.txt", "w", encoding="utf-8") as f:
    f.write("中文内容\n")
    f.write("Hello World\n")

with open("chinese.txt", "r", encoding="utf-8") as f:
    content = f.read()
    print(content)

# 输出结果
# 中文内容
# Hello World

示例2:处理编码错误

代码示例

# errors参数处理编码错误
# 'ignore' - 忽略无法解码的字符
with open("mixed_encoding.txt", "r", encoding="utf-8", errors="ignore") as f:
    content = f.read()

# 'replace' - 用?替换无法解码的字符
with open("mixed_encoding.txt", "r", encoding="utf-8", errors="replace") as f:
    content = f.read()

# 'strict' - 遇到错误抛出异常(默认行为)
with open("mixed_encoding.txt", "r", encoding="utf-8", errors="strict") as f:
    content = f.read()

四、上下文管理器with语句

使用 with 语句是Python文件操作的最佳实践。它能确保文件在使用完毕后自动关闭,即使发生异常也能正确清理资源。

示例1:with语句 vs 传统方式

代码示例

# 推荐做法:使用with语句
with open("data.txt", "r", encoding="utf-8") as f:
    content = f.read()
# 文件自动关闭,无需手动f.close()

# 不推荐:需要手动关闭
f = open("data.txt", "r", encoding="utf-8")
try:
    content = f.read()
finally:
    f.close()  # 必须手动关闭

示例2:同时操作多个文件

代码示例

# 同时打开多个文件
with open("input.txt", "r", encoding="utf-8") as infile, \
     open("output.txt", "w", encoding="utf-8") as outfile:
    
    for line in infile:
        processed = line.upper()
        outfile.write(processed)

print("文件处理完成!")

五、文件读写操作示例

示例1:逐行读取大文件

代码示例

# 高效读取大文件(内存友好)
line_count = 0
with open("large_file.txt", "r", encoding="utf-8") as f:
    for line in f:
        line_count += 1
        # 处理每一行
        if "error" in line.lower():
            print(f"第{line_count}行发现错误: {line.strip()}")

print(f"总行数: {line_count}")

示例2:readlines()和read()的区别

代码示例

# read() - 读取整个文件为字符串
with open("example.txt", "r", encoding="utf-8") as f:
    full_content = f.read()
    print(type(full_content))  # <class 'str'>

# readlines() - 读取所有行返回列表
with open("example.txt", "r", encoding="utf-8") as f:
    lines = f.readlines()
    print(type(lines))  # <class 'list'>
    print(f"共{len(lines)}行")
    for i, line in enumerate(lines, 1):
        print(f"第{i}行: {line.strip()}")

示例3:写入列表数据到文件

代码示例

# 写入多行数据
data = ["第一行数据", "第二行数据", "第三行数据"]

with open("data_output.txt", "w", encoding="utf-8") as f:
    for item in data:
        f.write(item + "\n")

# 使用writelines()更高效
with open("data_output.txt", "w", encoding="utf-8") as f:
    f.writelines(line + "\n" for line in data)

print("数据写入完成!")

六、文件操作模式对比表格

模式 名称 文件不存在 文件已存在 读写权限
r 只读 抛出FileNotFoundError 正常打开 只读
w 写入 创建新文件 清空原内容 只写
a 追加 创建新文件 末尾追加内容 只写
x 独占创建 创建新文件 抛出FileExistsError 只写
b 二进制 与其他模式组合使用 与其他模式组合使用 取决于组合模式
+ 更新 与其他模式组合使用 可读可写 读写

七、文件操作最佳实践

  • 始终使用with语句:确保文件正确关闭,避免资源泄漏。

  • 显式指定encoding:避免平台默认编码差异导致的乱码问题。

  • 大文件逐行读取:使用 for line in f: 而不是 f.readlines(),节省内存。

  • 使用pathlib处理路径:Python 3.4+推荐使用 pathlib.Path 处理文件路径。

  • 检查文件是否存在:使用 os.path.exists()pathlib.Path.exists() 提前检查。

提示:使用 w 模式时要格外小心,因为它会清空文件原有内容。如果需要保留原内容,请使用 a 模式或先备份文件。

八、注意事项

  • 路径分隔符:Windows使用 \,Linux/Mac使用 /。建议使用原始字符串 r"path\to\file"os.path.join()

  • 文件指针位置:读写操作后文件指针会移动,使用 f.seek(0) 可以回到文件开头。

  • 二进制模式不使用encoding:使用 b 模式时不能指定encoding参数,因为返回的是bytes对象。

  • 换行符处理:Windows使用 \r\n,Unix使用 \n。Python文本模式会自动转换,二进制模式不会。


小贴士

文件操作快捷方式:Python 3.5+提供了 pathlib 模块,可以更简洁地读写文件:Path("file.txt").read_text(encoding="utf-8")Path("file.txt").write_text("内容", encoding="utf-8")。此外,io 模块提供了更高级的流操作接口。

常见问题

open()打开文件后忘记关闭会有什么后果?

未关闭的文件会占用系统资源(文件描述符),可能导致"Too many open files"错误。写入操作的数据可能不会立即写入磁盘。始终使用with语句可以自动关闭文件,避免此类问题。

如何判断文件是否已经打开成功?

可以使用try-except捕获异常:try: f = open("file.txt") except FileNotFoundError: print("文件不存在")。也可以使用 f.closed 属性检查文件是否关闭。

r+模式和w+模式有什么区别?

r+模式打开已存在文件,不会清空内容,文件指针在开头,可以读写。w+模式如果文件已存在会先清空内容,如果文件不存在会创建新文件。两者都支持读写操作,但对原文件内容的处理方式不同。

如何处理大型CSV或JSON文件?

对于大文件,建议逐行处理而不是全部读入内存。CSV文件可以使用 csv 模块逐行读取,JSON大文件可以使用 ijson 库进行流式解析,或者使用 pandaschunksize 参数分块读取。

十一、练习题

练习1

编写一个函数 copy_file(src, dst),实现文件复制功能。要求:(1) 支持文本和二进制文件;(2) 使用with语句;(3) 处理文件不存在等异常情况;(4) 返回复制的字节数。编写完整代码并测试。

练习2

编写一个函数 count_words_in_file(filepath),统计文本文件中的单词数量、行数和字符数。要求:(1) 正确处理UTF-8编码;(2) 逐行读取以节省内存;(3) 返回包含统计结果的字典。编写完整代码并测试。

标签: open函数 文件操作 Python内置函数 with语句 文件读写 encoding编码 Python教程

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Python max和min函数 - 求最大值最小值 下一篇: Python pow和round函数 - 幂运算四舍五入

poll相关推荐