[Python编程] Python3 文件操作
目录
一、核心入口:Python3 的 open () 方法
1️⃣open () 的基础用法
2️⃣ open () 的完整语法
2. readline ():逐行读取
3. readlines ():读取所有行到列表
三、实战场景:文件操作的常见用法
1️⃣配置文件的读取与写入
示例:操作 config.txt 配置文件
2️⃣程序日志的记录
示例:记录 app.log 日志
四、扩展工具:Python3 的 OS 模块
1️⃣基础文件与目录操作
2️⃣高级操作:遍历目录树(os.walk ())
语法与示例
3️⃣路径处理神器:os.path 模块
4️⃣其他实用功能
五、总结与学习建议
对于 Python 初学者而言,文件操作是入门阶段必须掌握的核心技能之一。无论是读取配置文件、记录程序日志,还是处理数据文件,都离不开文件操作的相关知识。本文将基于 Python3 的特性,从open()
方法、file 对象、实际应用场景到 OS 模块,系统梳理文件操作的全流程,帮你快速上手并灵活运用。
一、核心入口:Python3 的 open () 方法
文件操作的第一步是 “打开文件”,Python 通过内置的open()
函数实现这一功能,它会返回一个文件对象,后续的读、写、关闭等操作都依赖这个对象。
1️⃣open () 的基础用法
open()
最常用的形式只需两个参数:文件名(路径)和打开模式,语法如下:
python
运行
open(file, mode)
- file:必需参数,文件的路径(相对路径或绝对路径,下文会详细说明)。
- mode:可选参数,定义文件的操作类型,常见模式如下表:
模式 | 含义 | 注意事项 |
---|---|---|
'r' | 读模式(默认) | 只能读取文件,若文件不存在会报错 |
'w' | 写模式 | 若文件存在则清空内容,不存在则创建新文件 |
'a' | 追加模式 | 若文件存在则在末尾添加内容,不存在则创建 |
'b' | 二进制模式 | 用于处理图片、视频等非文本文件,需与其他模式组合(如 'rb'、'wb') |
'+' | 读写模式 | 可同时读写文件,需与其他模式组合(如 'r+'、'a+') |
2️⃣ open () 的完整语法
实际开发中可能需要更精细的控制,open()
的完整参数如下:
python
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
1.关键参数补充说明:
- encoding:指定文件编码格式,处理中文文件时必须设置为
utf-8
,否则可能出现乱码。 - buffering:设置缓冲策略,默认值
-1
表示使用系统默认缓冲,0
表示无缓冲(仅二进制模式可用),1
表示行缓冲(仅文本模式可用)。 - errors:定义编码错误的处理方式,如
errors='ignore'
表示忽略编码错误(谨慎使用)。
| 手动open | ```python
file = open('example.txt', 'r', encoding='utf-8')
try:content = file.read()
finally:file.close() # 必须手动关闭
``` | 灵活控制关闭时机 | 容易遗漏close(),导致资源问题 |### 1.4 必学:文件路径的正确写法
文件路径错误是初学者最常见的问题之一,路径分为两种类型:
- **相对路径**:相对于当前Python脚本运行的目录。例如,脚本在`D:\py_project`目录下,要打开该目录下`data`文件夹中的`example.txt`,路径写为`data/example.txt`。
- **绝对路径**:从系统根目录开始的完整路径。例如,`D:\py_project\data\example.txt`(Windows)或`/home/user/py_project/data/example.txt`(Linux/macOS)。> 小贴士:Windows系统中路径分隔符是`\`,但在Python中需写为`\\`(转义)或直接用`/`(Python跨平台支持),避免语法错误。## 二、操作核心:Python3的file对象
通过`open()`函数获得`file`对象后,所有文件操作都依赖它的方法。下表整理了最常用的13个方法,按使用频率排序:| 序号 | 方法 | 功能描述 |
|------|------|----------|
| 1 | `file.read([size])` | 读取文件内容:无参数时读取全部内容,指定`size`则读取对应字节数,返回字符串(文本模式)或字节流(二进制模式)。 |
| 2 | `file.readline([size])` | 读取一行内容(包含换行符`\n`),适合处理大文件(占用内存小),返回字符串。 |
| 3 | `file.readlines([sizeint])` | 读取所有行,返回列表(每行作为一个元素),大文件使用会占用较多内存。 |
| 4 | `file.write(str)` | 写入字符串到文件,返回写入的字符长度(文本模式);二进制模式需写入字节流(如`b"hello"`)。 |
| 5 | `file.writelines(sequence)` | 写入字符串列表,需手动添加换行符(如`["line1\n", "line2\n"]`)。 |
| 6 | `file.close()` | 关闭文件,关闭后无法再操作(`with open`会自动调用)。 |
| 7 | `file.seek(offset[, whence])` | 移动文件指针到指定位置:`offset`是偏移量,`whence=0`(默认,从文件开头算)、`1`(从当前位置算)、`2`(从文件末尾算)。 |
| 8 | `file.tell()` | 返回当前文件指针的位置(字节数)。 |
| 9 | `file.flush()` | 强制刷新缓冲区,将内存中的数据写入文件(无需等待缓冲区满)。 |
| 10 | `file.truncate([size])` | 截断文件:指定`size`则保留前`size`个字符,无参数则从当前指针位置截断。 |
| 11 | `file.fileno()` | 返回文件描述符(整数),用于底层系统操作(如OS模块)。 |
| 12 | `file.isatty()` | 判断文件是否连接到终端设备,返回布尔值(通常用于判断是否为控制台输入)。 |
| 13 | `file.next()` | Python3中已废弃,改用`next(iter(file))`读取下一行。 |### 重点区分:read()、readline()、readlines()
这三个方法都用于读取文件,但适用场景不同,初学者容易混淆,通过实例对比理解:假设`a.txt`文件内容如下:
HelloWelcomeWhat is the python...
plaintext
#### 1. read():读取全部内容
```python
with open('a.txt', 'r', encoding='utf-8') as file:content = file.read()
print(content)
# 输出:
# Hello
# Welcome
# What is the python...
print(type(content)) # <class 'str'>
适用场景:小文件,需一次性获取全部内容。
2. readline ():逐行读取
python
运行
with open('a.txt', 'r', encoding='utf-8') as file:line1 = file.readline()line2 = file.readline()
print(line1) # Hello\n
print(line2) # Welcome\n
适用场景:大文件,避免一次性加载占用过多内存(可配合while
循环读取所有行)。
3. readlines ():读取所有行到列表
python
运行
with open('a.txt', 'r', encoding='utf-8') as file:lines = file.readlines()
print(lines) # ['Hello\n', 'Welcome\n', 'What is the python...\n']
适用场景:需按行处理文件(如逐行分析日志),且文件大小适中。
三、实战场景:文件操作的常见用法
掌握基础方法后,结合实际场景才能真正学会运用。以下是两个最常用的场景:
1️⃣配置文件的读取与写入
程序的配置信息(如数据库地址、用户账号)通常存储在文本文件中,通过文件操作实现 “读取配置” 和 “更新配置”。
示例:操作 config.txt 配置文件
python
# 1. 读取配置
config_path = 'config.txt'
with open(config_path, 'r', encoding='utf-8') as file:current_config = file.read()
print("当前配置:", current_config)# 2. 更新配置(覆盖原内容)
new_config = "user=admin\npassword=123456\nserver=localhost:3306"
with open(config_path, 'w', encoding='utf-8') as file:file.write(new_config)
print("配置已更新!")# 3. 追加配置(不覆盖原内容)
extra_config = "\ntimeout=30"
with open(config_path, 'a', encoding='utf-8') as file:file.write(extra_config)
print("额外配置已追加!")
2️⃣程序日志的记录
程序运行时的状态(如 “启动成功”)、错误信息(如 “连接失败”)需要记录到日志文件,便于调试和维护。日志通常用追加模式('a') 写入,避免覆盖历史记录。
示例:记录 app.log 日志
python
import datetime # 用于添加时间戳log_path = 'app.log'
# 获取当前时间(格式:年-月-日 时:分:秒)
current_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")# 追加日志内容
with open(log_path, 'a', encoding='utf-8') as file:file.write(f"[{current_time}] INFO: 程序启动成功\n")file.write(f"[{current_time}] ERROR: 数据库连接超时\n")print("日志已记录!")
打开app.log
会看到:
plaintext
[2024-05-20 15:30:00] INFO: 程序启动成功
[2024-05-20 15:30:05] ERROR: 数据库连接超时
四、扩展工具:Python3 的 OS 模块
文件操作不仅限于 “读写内容”,还包括创建目录、删除文件、遍历文件夹等系统级操作。Python 的os
模块提供了这些功能,是文件操作的重要补充。
1️⃣基础文件与目录操作
os
模块的核心函数,覆盖日常 90% 的系统操作需求:
函数 | 功能 | 示例 |
---|---|---|
os.mkdir(path) | 创建单个目录 | os.mkdir('new_dir') (创建 new_dir 文件夹) |
os.rmdir(path) | 删除空目录(非空目录会报错) | os.rmdir('new_dir') |
os.rename(old, new) | 重命名文件 / 目录 | os.rename('old.txt', 'new.txt') |
os.remove(path) | 删除文件(不能删除目录) | os.remove('unused.txt') |
os.getcwd() | 获取当前工作目录 | print(os.getcwd()) (输出如D:\py_project ) |
os.chdir(path) | 切换工作目录 | os.chdir('D:\py_project') |
os.listdir(path) | 列出目录下所有文件 / 目录 | os.listdir('.') (列出当前目录内容,返回列表) |
2️⃣高级操作:遍历目录树(os.walk ())
当需要处理 “目录及其所有子目录” 时,os.walk()
是最高效的工具。它会生成一个生成器,逐一生成每个目录的信息(路径、子目录、文件),避免一次性加载所有内容。
语法与示例
python
import os# 遍历指定目录(此处为当前目录'.')
for root, dirs, files in os.walk('.', topdown=True):# root:当前遍历的目录路径# dirs:当前目录下的所有子目录列表# files:当前目录下的所有文件列表print(f"当前目录:{root}")print(f"子目录:{dirs}")print(f"文件:{files}")print("-" * 50)
参数说明:
top
:要遍历的根目录路径。topdown=True
:默认 “自上而下” 遍历(先根目录,再子目录);设为False
则 “自下而上”。onerror
:可选,用于处理遍历中的错误(如权限不足)。
3️⃣路径处理神器:os.path 模块
os.path
是os
模块的子模块,专门解决路径拼接、判断路径有效性等问题,跨平台兼容性极强(自动适配 Windows/Linux/macOS 的路径格式)。
常用函数示例:
python
import os# 1. 路径拼接(避免手动写分隔符)
dir_path = 'data'
file_name = 'example.txt'
full_path = os.path.join(dir_path, file_name)
print(full_path) # Windows输出data\example.txt,Linux输出data/example.txt# 2. 判断路径是否存在
print(os.path.exists(full_path)) # True(存在)/False(不存在)# 3. 判断是否为文件/目录
print(os.path.isfile(full_path)) # True(是文件)
print(os.path.isdir(dir_path)) # True(是目录)# 4. 获取文件的绝对路径
print(os.path.abspath(full_path)) # 输出完整绝对路径# 5. 分离文件名与目录
dir_part, file_part = os.path.split(full_path)
print(dir_part) # data
print(file_part) # example.txt# 6. 获取文件扩展名
print(os.path.splitext(file_part)[1]) # .txt
4️⃣其他实用功能
- 环境变量操作:通过
os.environ
获取或设置环境变量,如os.environ.get('HOME')
(获取用户主目录)、os.environ['NEW_VAR'] = 'value'
(设置新环境变量)。 - 执行系统命令:
os.system(cmd)
执行系统命令(如os.system('dir')
在 Windows 中列出目录内容),但返回值是命令执行状态码,如需获取命令输出,可使用os.popen(cmd).read()
。 - 文件权限管理:
os.stat(path)
获取文件状态(如权限、大小),os.chmod(path, mode)
修改文件权限(如os.chmod('file.txt', 0o755)
设置读写执行权限)。
五、总结与学习建议
Python 文件操作的核心逻辑可总结为:通过open()
获取 file 对象 → 用 file 对象方法操作内容 → 用 OS 模块处理系统级文件 / 目录 → 优先使用with open
和os.path
保证安全与跨平台。
对于初学者,建议按以下步骤练习:
- 先掌握
open()
的r
/w
/a
模式,用with open
完成简单的读写。 - 区分
read()
/readline()
/readlines()
的用法,处理不同大小的文件。 - 学习
os
模块的基础操作(创建目录、重命名文件),再尝试os.walk()
遍历目录。 - 用
os.path
替代手动拼接路径,培养跨平台思维。
通过 “配置文件读写”“日志记录”“批量处理文件” 等小项目实践,能快速巩固这些知识,让文件操作从 “理论” 变成 “技能”。