十分想念顺店杂可。。。
在 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确保文件关闭。
这些方法可满足绝大多数文件读写场景,包括文本处理、日志记录、文件复制等。
861

被折叠的 条评论
为什么被折叠?



