Python 文件(File) 的常用方法
十分想念顺店杂可。。。
在 Python 中,文件操作是数据持久化的核心手段,主要通过内置的 open()
函数创建文件对象(file object),再通过文件对象的方法实现读写等操作。以下是文件操作的常用方法及核心知识点:
一、文件的打开与关闭
所有文件操作的前提是打开文件,操作完成后需关闭文件(释放资源)。
1. 打开文件:open()
函数
语法:
file_object = open(file_path, mode='r', encoding=None)
- 参数说明:
file_path
:文件路径(相对路径或绝对路径)。mode
:打开模式(决定文件可执行的操作,默认'r'
),常用模式如下:模式 含义 备注 'r'
只读(默认) 文件不存在则报错 'w'
只写 文件不存在则创建,存在则覆盖原内容 'a'
追加 文件不存在则创建,新内容添加到末尾 'r+'
读写 可读可写,不覆盖原内容(需注意指针位置) 'w+'
读写 先清空文件再读写(慎用,会覆盖) 'a+'
读写 追加模式下可读(读需移动指针) 模式后加 'b'
(如'rb'
、'wb'
)二进制模式 用于非文本文件(图片、音频等),无需指定 encoding
encoding
:文本文件的编码格式(如'utf-8'
、'gbk'
),二进制模式无需指定。
2. 关闭文件:close()
方法
打开的文件必须关闭,否则可能导致资源泄露或数据未写入磁盘:
f = open("test.txt", "r")
# 操作文件...
f.close() # 关闭文件
3. 上下文管理器(推荐):with
语句
with
语句可自动管理文件关闭(即使操作中出错),无需手动调用 close()
,是最佳实践:
with open("test.txt", "r", encoding="utf-8") as f:# 操作文件(缩进内)content = f.read()
# 缩进外,文件已自动关闭
二、文件读取方法(适用于 'r'
或带读权限的模式)
文件对象提供多种读取方法,适用于不同场景:
1. read(size=-1)
:读取指定字节 / 全部内容
size
为整数时,读取最多size
字节;默认-1
,读取全部内容。- 适合小文件,大文件读取可能占用过多内存。
with open("test.txt", "r", encoding="utf-8") as f:content = f.read() # 读全部内容print(content)with open("test.txt", "r") as f:part = f.read(10) # 读前10字节print(part)
2. readline(size=-1)
:读取一行内容
- 读取到换行符
\n
为止,返回包含换行符的字符串;size
限制最大字节数。 - 适合大文件(逐行读取,节省内存)。
with open("test.txt", "r") as f:line1 = f.readline() # 读第1行line2 = f.readline() # 读第2行print(line1, end="") # 避免print自动加换行(因line1已有\n)
3. readlines(hint=-1)
:读取所有行到列表
- 返回列表,每个元素是一行内容(含换行符);
hint
为字节数上限,超过则停止。 - 适合中等大小文件,便于按行处理。
with open("test.txt", "r") as f:lines = f.readlines() # 所有行存入列表for line in lines:print(line.strip()) # strip()去除换行符和空白
4. 迭代文件对象(推荐大文件)
文件对象本身是可迭代的,直接用 for
循环逐行读取,内存效率最高:
with open("large_file.txt", "r") as f:for line in f: # 逐行迭代,无需一次性加载全部print(line.strip())
三、文件写入方法(适用于 'w'
、'a'
或带写权限的模式)
写入操作需注意:文本模式下写入字符串,二进制模式下写入字节流(bytes
)。
1. write(string)
:写入字符串
- 返回写入的字符数(文本模式)或字节数(二进制模式)。
- 不会自动添加换行符,需手动加
\n
。
# 写入新文件('w'模式会覆盖原有内容)
with open("output.txt", "w", encoding="utf-8") as f:f.write("Hello, Python!\n") # 手动加换行f.write("这是第二行")# 追加内容('a'模式)
with open("output.txt", "a", encoding="utf-8") as f:f.write("\n这是追加的一行")
2. writelines(iterable)
:写入可迭代对象
- 写入字符串序列(如列表、元组),不自动添加换行符,需手动在元素中包含
\n
。
lines = ["第一行\n", "第二行\n", "第三行"]
with open("output.txt", "w") as f:f.writelines(lines) # 批量写入列表内容
3. flush()
:强制刷新缓冲区
写入内容通常先存于内存缓冲区,关闭文件或缓冲区满时才写入磁盘。flush()
可强制立即写入:
with open("log.txt", "a") as f:f.write("即时日志...")f.flush() # 立即写入磁盘(常用于日志、实时数据)
四、文件指针操作(随机访问)
文件指针标记当前读写位置,可通过以下方法移动指针(适用于非追加模式,'a'
模式指针始终在末尾):
1. tell()
:获取当前指针位置
返回从文件开头到当前位置的字节数:
with open("test.txt", "r") as f:f.read(5) # 读5字节print(f.tell()) # 输出5(当前指针在第5字节后)
2. seek(offset, whence=0)
:移动指针位置
offset
:偏移量(字节数,正数向后移,负数向前移)。whence
:基准位置(0:文件开头,1:当前位置,2:文件末尾),文本模式下仅支持0
。
with open("test.txt", "r+") as f: # 读写模式f.seek(5) # 从开头移动5字节f.write("abc") # 从第5字节开始覆盖写入f.seek(0) # 移回开头print(f.read()) # 读取修改后的内容
五、其他常用方法
closed
:判断文件是否已关闭(True
/False
)。f = open("test.txt", "r") print(f.closed) # False f.close() print(f.closed) # True
name
:返回文件名(路径)。with open("test.txt", "r") as f:print(f.name) # 输出 "test.txt"
六、异常处理(文件操作必备)
文件操作可能出现错误(如文件不存在、权限不足),需用 try-except
捕获异常:
try:with open("test.txt", "r") as f:content = f.read()
except FileNotFoundError:print("错误:文件不存在")
except PermissionError:print("错误:没有访问权限")
except Exception as e:print(f"发生错误:{e}")
七、二进制文件操作(图片、音频等)
处理非文本文件(如图片、视频)时,需用二进制模式(加 'b'
),读写数据为 bytes
类型:
# 读取图片
with open("image.jpg", "rb") as f:img_data = f.read() # 字节流# 写入图片(复制文件)
with open("copy_image.jpg", "wb") as f:f.write(img_data) # 写入字节流
总结
文件操作核心流程:
打开文件(with open)→ 读写操作(read/write等)→ 自动关闭
关键注意点:
- 区分文本模式(需
encoding
)和二进制模式('b'
)。 'w'
模式会覆盖原文件,谨慎使用;追加用'a'
。- 大文件优先用逐行迭代(
for line in f
),避免内存溢出。 - 始终用
with
语句或try-finally
确保文件关闭。
这些方法可满足绝大多数文件读写场景,包括文本处理、日志记录、文件复制等。