Python基础:文件操作
文章目录
在 Python 中,文件操作是一项基础且重要的技能,主要涉及文件的打开、读取、写入、关闭等操作。下面我们来了解一下文件操作的基础知识。
一、知识点详解
1.1 文件打开与关闭
在 Python 中,使用内置函数 open()
打开文件,使用 close()
关闭文件。
文件使用完毕后必须关闭,否则会占用系统资源,所以二者一般需配套使用。
open()
函数基本语法:open(file, mode='r', encoding=None)
核心参数:
file(必需)
:文件路径(字符串)
mode(可选)
:文件的打开模式,默认'r'
(读取模式)
encoding(可选)
:文件的编码格式(默认 None,仅文本模式适用),常用编码:'utf-8'
、'gbk'
、'ascii'
等
示例:
# 打开文件(如果文件不存在,会报错)
file = open('example.txt', 'r', encoding="utf-8") # 'r' 表示读取模式
# 使用文件...
# 关闭文件
file.close()
安全写法(使用 with
语句):
with
语句:执行文件操作后自动关闭文件释放内存(as 别名 == 起别名)
# with语句基本语法
with open(file, mode, encoding="utf-8") as 别名:
# 在 with 代码块内使用文件
# 文件会在代码块结束后自动关闭
pass
文件两种路径的两种表示方法:
绝对路径:完整的磁盘路径,如C:\Users\user\file.txt
相对路径:相对于当前工作目录的路径,.
表示当前目录,..
表示上级目录
注意:
绝对路径中反斜杠(\
)需转义或使用原始字符串(r'path'
)
# 正确写法(转义)
open('C:\\Users\\user\\file.txt', 'r', encoding="utf-8")
# 或原始字符串
open(r'C:\Users\user\file.txt', 'r', encoding="utf-8")
1.2 文件打开模式
open()
函数的第二个参数 mode
用于指定文件的打开模式:
模式 | 说明 | 文本模式 | 二进制模式 | 指针(光标)位置 | 文件不存在时 | 文件存在时 |
---|---|---|---|---|---|---|
r | 读取 | r | rb | 文件开头 | ❌ 报错 | ✅ 打开 |
w | 写入 | w | wb | 文件开头(覆盖) | ✅ 创建新文件 | ✅ 清空内容 |
a | 追加 | a | ab | 文件末尾 | ✅ 创建新文件 | ✅ 保留内容 |
x | 新建(排他创建) | x | xb | 文件开头 | ✅ 创建新文件 | ❌ 报错(FileExistsError) |
+ | 读写模式(需与其他模式组合) | r+ , w+ , a+ | rb+ , wb+ , ab+ | 取决于组合模式 | 取决于组合模式 | 取决于组合模式 |
模式组合说明
-
读写模式(
+
):
r+
:读取 + 写入,指针(光标)初始在文件开头。
w+
:写入 + 读取,会清空文件内容。
a+
:追加 + 读取,指针初始在文件末尾。 -
文本模式 vs 二进制模式:
文本模式(默认):处理字符串,自动转换换行符(如\r\n
→\n
)。
二进制模式(带b
):处理字节(bytes
对象),用于非文本文件(如图像、音频、视频)。
示例:
# 写入模式(覆盖已有内容)
with open('example.txt', 'w', encoding="utf-8") as file:
file.write('你好呀, 今天天气晴朗!')
# 追加模式(不覆盖已有内容)
with open('example.txt', 'a', encoding="utf-8") as file:
file.write('\n这里新起一行插入内容.')
# 二进制读取模式(用于非文本文件)
with open('image.jpg', 'rb') as file:
data = file.read()
注意:二进制模式(rb
)处理字节流,不涉及字符编码,指定encoding会报错
1.3 文件读取操作
打开文件后,可以使用以下方式读取内容:
read()
函数:读取整个文件内容
# 读取整个文件内容
with open('example.txt', 'r', encoding="utf-8") as file:
content = file.read() # 读取整个文件内容到一个字符串
print(content)
# 按 字节(二进制文件) / 字符(文本文件) 读取
with open('example.txt', 'r', encoding='utf-8') as file:
# 先读取 5 个字符,用于下面循环语句判断
chunk = file.read(5) # 这里的 read(5) 代表读取 5个字符
while chunk:
print(chunk.strip()) # strip() 去除行末的换行符
chunk = file.read(5) # 更新chunk的值,用于循环读取文件所有内容
注意:在Python中,空格,制表符 \t
,换行符 \n
,回车符 \r
等都属于空白字符
,若这些字符在字符串开头和结尾时,可以使用字符串的strip()
方法去除
readline()
函数:逐行读取文件内容,每次调用读取文件的一行内容
readlines()
函数:一次性读取所有行,返回一个列表,每行作为一个元素
# 逐行读取文件内容
# 方法1:使用 readline() 逐行读取文件内容
with open('example.txt', 'r', encoding="utf-8") as file:
line = file.readline() # 读取第一行
while line:
print(line.strip()) # strip() 去除行末的换行符
line = file.readline() # 读取下一行
# 方法2:使用 readlines() 返回包含所有行的列表
with open('example.txt', 'r', encoding="utf-8") as file:
lines = file.readlines()
for line in lines:
print(line.strip()) # strip() 去除行末的换行符
# 方法3:直接遍历文件对象(更高效)
with open('example.txt', 'r', encoding="utf-8") as file:
file.seek(0) # 将文件指针重置到开头
for line in file: # 文件对象本身就是可迭代的
print(line.strip())
1.4 文件写入操作
使用 write()
或 writelines()
方法写入内容:
# 写入字符串
with open("example.txt", "w", encoding="utf-8") as file:
file.write("今天星期二\n") # \n 表示换行
file.write("我们今天学习文件操作...\n")
# 写入多行(列表)
lines = ["\n插入第一行\n", "插入第二行\n", "插入第三行\n"]
with open("example.txt", "a+", encoding="utf-8") as file:
file.writelines(lines) # 注意:不会自动添加换行符,需要手动添加
1.5 文件指针操作
文件指针(光标)指示当前读写的位置,可以使用 seek()
和 tell()
方法操作:
-
file.seek(offset, whence=0)
:移动文件指针到指定位置
offset
:偏移量(字节数)
whence
:参考点(0=文件开头,1=当前位置,2=文件末尾,默认为0)
注意:文本文件中只能使用whence=0
,二进制文件可使用所有参考点 -
file.tell()
:返回当前指针位置(字节偏移量)
注意:
文本文件中返回值可能与字符位置不一致(utf-8中一个中文字符占3个字节数)
返回值适合作为seek()
的参数
示例:
with open("example.txt", "r", encoding="utf-8") as file:
# 读取前5个字符
print(file.read(5)) # 输出: 今天星期二
# 获取当前指针位置
# utf-8中文字符占3字节
print(file.tell()) # 输出: 15
# 将指针移动到文件开头
file.seek(0)
# 读取一行(从头开始)
print(file.readline()) # 输出: 今天星期二
print(file.tell()) # 输出: 17
# 这里为什么输出 17 ?
print(len("\n")) # 输出: 1
# "\n"不是应该占用 1个字节么
# 15(中文字节) + 1(\n字节) = 16
为什么输出 17
?
Windows文本模式下:
写入时:\n
→ 自动转 \r\n
(+1字节)
读取时:\r\n
→ 自动转 \n
(但消耗2字节)
UTF-8中文字占3字节 + Windows换行符占2字节 → 5中文字+换行符 = 17字节
1.6 文件操作异常处理
文件操作可能会出现异常(如文件不存在、权限不足等),建议使用 try-except
捕获异常:
try:
with open('nonexistent.txt', 'r', encoding="utf-8") as file:
content = file.read()
except FileNotFoundError:
print("错误:文件不存在!")
except PermissionError:
print("错误:没有访问权限!")
except Exception as e:
print(f"错误:发生未知异常 - {e}")
二、 应用示例
# 读取文件并统计行数
try:
with open('example.txt', 'r') as file:
lines = file.readlines()
print(f"文件共有 {len(lines)} 行。")
# 统计包含特定关键词的行数
keyword = 'test'
count = sum(1 for line in lines if keyword in line)
print(f"包含 '{keyword}' 的行有 {count} 行。")
except FileNotFoundError:
print("文件不存在,请检查路径。")
三、知识点总结
-
文件打开与关闭
用open(file, mode, encoding)
打开文件,mode
默认'r'
(读),encoding
用于文本模式(如utf-8
)
必须关闭文件,推荐用with
语句自动释放资源,避免忘记调用close()
路径需注意转义(\\
)或原始字符串(r''
),区分绝对路径(完整路径)和相对路径(.
当前目录) -
文件打开模式
r
(读):文件不存在报错,从开头读取
w
(写):清空文件或创建新文件,覆盖写入
a
(追加):从末尾写入,保留原内容,文件不存在则创建
x
(新建):文件存在则报错(排他性创建)
+
(读写):如r+
(读写,开头)、a+
(追加+读,需手动移动指针)
二进制模式(带b
):处理字节流(如图像),不涉及编码,用rb/wb/ab
-
文件读取操作
read()
:读取全部内容为字符串,可指定字符数(文本)或字节数(二进制)
readline()
:逐行读取,返回单行字符串(含\n
)
readlines()
:读取所有行,返回列表(每行一个元素)
遍历文件对象:for line in file
更高效,自动逐行读取 -
文件写入操作
write(string)
:写入字符串,\n
需手动添加换行
writelines(lines)
:写入字符串列表,不自动添加换行符,需手动处理
写入模式(w/a
):w
清空文件,a
从末尾追加 -
文件指针操作
seek(offset, whence)
:移动指针,whence=0
(开头,文本模式唯一支持)、1
(当前位置)、2
(末尾,仅二进制可用)
tell()
:返回当前指针位置(字节数),文本中需注意中文字符占3字节(UTF-8)、Windows换行符占2字节(\r\n
) -
文件操作异常处理
用try-except
捕获常见异常:
FileNotFoundError
(文件不存在)、PermissionError
(权限不足)
通用Exception
捕获其他未知错误,增强程序的稳定性 -
注意事项
优先用with
语句管理文件,确保关闭
明确模式用途:r
读、w
覆盖写、a
追加、b
二进制、+
读写组合
大文件避免用read()
/readlines()
,改用逐行遍历
二进制文件不指定encoding
,文本路径注意转义