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("数据写入完成!")
六、文件操作模式对比表格
七、文件操作最佳实践
-
始终使用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 库进行流式解析,或者使用 pandas 的 chunksize 参数分块读取。
十一、练习题
练习1
编写一个函数 copy_file(src, dst),实现文件复制功能。要求:(1) 支持文本和二进制文件;(2) 使用with语句;(3) 处理文件不存在等异常情况;(4) 返回复制的字节数。编写完整代码并测试。
练习2
编写一个函数 count_words_in_file(filepath),统计文本文件中的单词数量、行数和字符数。要求:(1) 正确处理UTF-8编码;(2) 逐行读取以节省内存;(3) 返回包含统计结果的字典。编写完整代码并测试。
本文涉及AI创作
内容由AI创作,请仔细甄别