当前位置: 首页 > java >正文

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 确保文件关闭。

这些方法可满足绝大多数文件读写场景,包括文本处理、日志记录、文件复制等。

http://www.xdnf.cn/news/17348.html

相关文章:

  • NOIP 2024 游记
  • 【/usr/bin/env: “bash\r”: 没有那个文件或目录】问题解决
  • Java中的方法引用操作符(::)详解与实战应用
  • 2025华数杯数学建模A题【 多孔膜光反射性能的优化与控制】原创论文讲解(含完整python代码)
  • 电脑定时开关机终极指南
  • Python合并两个PDF文件
  • php防注入和XSS过滤参考代码
  • Access开发右下角浮窗提醒
  • Next.js 数据获取:使用 getServerSideProps 进行服务器端渲染
  • 机器学习——07 朴素贝叶斯
  • 强制用户更改WordPress密码的重要性及实现方法
  • Java集合中的链表
  • 控制建模matlab练习11:伯德图
  • ORACLE看当前连接数的方法
  • 【Oracle篇】Oracle Data Pump远程备份技术:直接从远端数据库备份至本地环境
  • USRP 毫米波通信解决方案
  • Jmeter使用第一节-认识面板(Mac版)
  • Linux图文理解进程
  • winform中的listbox实现拖拽功能
  • mysql的InnoDB索引总结
  • Oracle 关闭 impdp任务
  • JavaScript 伪装者现形记:类数组的真面目!
  • 数据结构与算法
  • Maven私服搭建--Nexus-3.82.0 Linux环境
  • 多场景两阶段分布式鲁棒优化模型、数据驱动的综合能源系统
  • 一文入门 matplotlib:从基础图表到数据可视化初体验
  • HTTP 协议升级(HTTP Upgrade)机制
  • 力扣300:最长递增子序列
  • Java 八大经典排序算法全解析
  • 小米前端笔试和面试