- 第 101 篇 -
Date: 2025 - 05 - 26
Author: 郑龙浩/仟墨
Python - 文件部分
学习时间: 2025-05-19
文章目录
一 文件与路径
1 文本文件
- 可以使用 文本编辑软件 查看的文件
- 本质上还是二进制文件
- C 的源文件,Python 的源文件 也是文本文件
\r
表示回车\n
表示换行
2 二进制文件
保存的内容不可直接给人阅读,而是使用提供的 其他专门的 软件 内容才能让人看懂
比如要看图片,要用专门的软件打开 图片阅读文件,音频和视频同理
Eg: 图片文件、音频文件、视频文件…
二进制文件不能直接使用 文本文件软件 进行查看,比如不能使用 记事本 直接打开图片或者视频,否则会乱码
3 编码格式
① 常见编码格式
- ASCII: 最早的编码,只能表示英文字符和一些特殊符号
- UTF-8: 最常用的Unicode编码,可以表示几乎所有语言的字符
- GBK: 中文编码,主要用于简体中文
- ISO-8859-1: 西欧语言编码
② 指定编码格式
在Python中打开文件时,可以通过encoding
参数指定编码格式:
# 以UTF-8编码打开文件
file = open("example.txt", "r", encoding="utf-8")
# 以GBK编码打开文件
file = open("example.txt", "r", encoding="gbk")
③ 最佳格式
推荐使用UTF-8编码,它是跨平台、跨语言的最佳选择
在Python文件开头添加编码声明:
# -*- coding: utf-8 -*-
④ 处理编码错误
# 忽略无法解码的字符
with open('file.txt', 'r', encoding='utf-8', errors='ignore') as f:
content = f.read()
# 替换无法解码的字符
with open('file.txt', 'r', encoding='utf-8', errors='replace') as f:
content = f.read()
4 绝对路径
路径分为绝对路径、相对路径
绝对路径:从文件系统的根目录开始的完整路径
C:\Users\Name\Documents\file.txt 在Python读取的时候斜杠要反着来 C:/Users/Name/Documents/file.txt
5 相对路径
基本写法
file.txt
- 当前目录下的文件data/file.txt
- 当前目录的data子目录中的文件./config.ini
- 显式表示当前目录下的文件(等同于config.ini
)
返回上级目录
../
- 返回上一级目录../settings.ini
- 上级目录中的文件../../file.txt
- 上两级目录中的文件
组合路径
../logs/app.log
- 上级目录的logs子目录中的文件./../shared/data.txt
- 先当前目录,再上级,然后进入shared目录
二 操作文件的函数和方法
Python 中操作文件需要记住1个函数和3个方法
函数方法 | 名 | 说明 |
---|---|---|
函数 | open | 打开文件,并且返回文件操作对象 |
方法 | read | 将文件内容读取到内存 |
方法 | write | 将指定内容写入文件 |
方法 | close | 关闭文件 |
方法 | find | 查找内容,返回索引 |
三 操作文件基本套路
打开文件
open
函数的第一个参数是要打开的文件名(文件名区分大小写)- 如果文件存在,返回文件操作对象
- 如果文件不存在,会抛出异常
读、写文件
读:将文件内容读入内存
read
方法可以一次性读入并返回文件的所有内容写:将内存内存写入文件
write
关闭文件
close
方法负责关闭文件- 如果忘记关闭文件,会造成系统资源耗尽,而且会影响到后续对文件的访问
- 方法执行后,会把文件指针移动到文件的末尾
三个步骤
# 1 打开文件
file = open("文件路径", '打开方式', encoding='文件编码')
# 2 读取
text = file.read()
# 3 关闭
file.close() # 千万不要忘记关闭文件
四 文件指针
1 文件指针的基本介绍
文件指针标记从哪个位置开始读取数据
第一次打开文件的时候,通常文件指针会之指向文件的开始位置
当执行了
read
方法后,文件指针会移动到读取内容的末尾默认情况下会移动到 文件末尾
2 注意:第二次调用 read 方法的时候读取不到内容
- 如果执行了一次
read
方法,读取了所有的内容,那么再次调用read
方法的时候,不可以获取到内容!!!! - 因为 第一次读取之后,文件指针移动到了文件的末尾,再次调用的时候是从文件的末尾开始读取的,所以不会读取到任何的内容
3 seek(offset, whence)
和 tell()
seek(offset, whence)
:移动文件指针whence=0
:从文件开头计算(默认)whence=1
:从当前位置计算whence=2
:从文件末尾计算
tell()
:返回当前文件指针位置
with open('file.txt', 'r') as f:
print(f.tell()) # 输出:0
f.seek(5) # 移动到第5个字节
print(f.tell()) # 输出:5
五 打开文件的方式
1 基本语法
open 函数默认以 只读方式 打开文件,并且返回文件对象
file = open("文件路径", "访问方式", "文件编码")
2 访问方式
- 如果只需要读的话,第二个参数可以不用写
访问方式 | 说明 |
---|---|
r | 以 只读 的方式打开文件。如果文件存在,文件指针将会放在文件的开头,这是默认模式。如果文件不存在,会抛出异常 |
w | 以 只写 的方式打开文件。如果文件存在,如果写入,文件内容会被覆盖。如果文件不存在,创建新的文件 |
a | 以 追加 的方式打开文件。如果文件存在,文件指针将会放在文件的结尾。如果文件不存在,创建新的文件进行写入 |
r+ | 以 读写 的方式打开文件。如果文件存在,文件指针将会放在文件的开头。如果文件不存在,会抛出异常 |
w+ | 以 读写 的方式打开文件。如果文件存在,如果写入,文件内容会被覆盖。如果文件不存在,创建新的文件进行写入 |
a+ | 以 读写 的方式打开文件。如果文件存在,文件指针将会放在文件的结尾。如果文件不存在,创建新的文件进行写入 |
频繁的移动文件指针,会影响文件的读写效率,开发中更多的时候会以 只读、只写 的方式来操作文件
六 读取文件内容
(1)一次性读取文件内容
# 打开文件,并让file存储文件指针
file = open('源文件') # 或 open('文件', 'r') 效果是等效的
test = file.read()
print(test)
# 关闭文件(必须执行)
file.close()
# 打印结果
1234567
abcde
aaaaa
bbbbbbbbb
(2)readline
按行读取文件内容
1 前言
read
方法默认会把文件的 所有内容一次性读取到内存- 如果文件太大,对内存的占用会非常严重
2 readline
方法
readline
方法可以一次读取一行的内容readline
方法执行后,会把 文件指针 移动到 下一行,准备下次读取readline
方法可以利用循环也可以把一个很大的文件一次性读取出来
“源文件”文件
1234567
abcde
aaaaa
bbbbbbbbb
test1.py文件
# 打开文件,并让file存储文件指针
file = open('源文件') # 或 open('文件', 'r') 效果是等效的
while True:
# 每次循环,读取一行
test = file.readline() # 如果读取到末尾的时候,返回空字符串''
# 判断是否读取到内容 如果文件指针指向结尾,则braek
if not test: # 如果 not '' 则为 True
break
print(test, end = '')
# 关闭文件(必须执行)
file.close()
# 打印结果
1234567
abcde
aaaaa
bbbbbbbbb
(3)使用for lline int file
遍历文件内容
# 打开文件,并让file存储文件指针
file = open('源文件') # 或 open('文件', 'r') 效果是等效的
for line in file:
print(line, end = '') # 如果写的是 print(line) 会每一行下面多打印行空格,因为print会自动打印一行空格
# 关闭文件(必须执行)
file.close()
# 打印结果
1234567
abcde
aaaaa
bbbbbbbbb
(4)read(n)
与 readline(n)
可以写参数,n
表示读取多少个字符
file.read(5)
只打印前5个字符
# 打开文件,并让file存储文件指针
file = open('源文件') # 或 open('文件', 'r') 效果是等效的
test = file.read(5) # 只打印前5行
print(test)
# 关闭文件(必须执行)
file.close()
# 打印结果
12345
七 文件复制
1 小文件复制
(1 )步骤
- 打开源文件和目标文件
- 源文件以只读方式打开
- 目标文件以只写方式打开
- 将原文件的中的内容读取出来
- 将读取出来的内容写入到目标文件
- 关闭两个文件
(2 )具体实现
源文件
1234567
abcde
aaaaa
bbbbbbbbb
目标文件
复制以后,该文件内容与源文件相同
test2.py
# 1 打开文件
file_read = open('源文件')
file_write = open('目标文件', 'w')
# 2 读写文件
text = file_read.read()
text2 = file_write.write(text)
# 3 关闭打开的
file_read.close()
file_write.close()
2 大文件复制
因为文件太大,如果一次性读取出来的话会占用大量的内存空间,所以分行复制,一行一行的复制
(1)步骤
- 打开源文件和目标文件
- 源文件以只读方式打开
- 目标文件以只写方式打开
- 按照一行一行的形式将源文件中的内容复制到目标文件当中去
- 关闭两个文件
(2)具体实现
# 1 打开文件
file_read = open('源文件')
file_write = open('目标文件', 'w')
# 2 读写文件
while True:
# 读取一行内容
text = file_read.readline()
# 文件指针指向末尾,退出循环
if not text:
break
text2 = file_write.write(text)
# 3 关闭打开的
file_read.close()
file_write.close()
八 文件/目录的常用管理操作
1 基本介绍
在终端/文件浏览器中可以执行常规的 文件 / 目录 管理操作,例如:
创建、重命名、删除、改变路径、查看目录内容…
在
Python
中,如果用上面的功能的话,需要导入os
模块
2 文件操作
方法名 | 说明 | 例子 |
---|---|---|
rename |
重命名文件 | os.rename(源文件名,目标文件名) |
remove |
删除文件 | os.remove(文件名) |
3 目录操作
如下操作中,文件或者目录操作都支持 相对路径 和 绝对路径
方法名 | 说明 | 例子 |
---|---|---|
listdir |
目标列表 | os.listdir(目标名) |
mikdir |
创建目录 | os.mikdir(目标名) |
rmdir |
删除目录 | os.rmdir(目标名) |
getcwd |
获取当前目录 | os.getcwd() |
chdir |
修改工作目录 | os.chdir(目标目录) |
path.isdir |
判断是否是文件 | os.path.isdir(文件路径) |
九 自动关闭文件的方法
只要离开了缩进范围,就自动关闭了
1 打开一个文件
可以不手动写 close 方法关闭文件
with open('test.txt', 'r', encoding='utf-8') as file:
content = file.read()
print(content)
# 文件已自动关闭
2 同时打开多个文件
with open('input.txt', 'r') as infile, open('output.txt', 'w') as outfile:
data = infile.read()
outfile.write(data.upper())
# 两个文件都已自动关闭
十 文件刷新
一般来说不需要手动刷新
下面三种情况需要
实时日志记录:如果程序可能崩溃,希望日志立即写入硬盘,而不是一直在内存缓冲区
with open("debug.log", "a") as f: f.write("Error: something went wrong!\n") f.flush() # 确保日志立即写入,即使程序崩溃
长时间运行的文件写入:如果文件长时间不关闭,但希望内容尽快写入硬盘。
也就是如果大文件需要分批次写入,就需要每隔一段时间就刷新一次。
file = open("data.txt", "w") for i in range(1000000): file.write(f"Line {i}\n") if i % 1000 == 0: file.flush() # 每1000行刷一次,避免内存占用过高 file.close()
多进程/多线程共享文件:如果另一个进程需要立即读取刚写入的内容,但文件尚未关闭。
下面的情况不需要手动刷新
- 正常情况:用
with
语句或正确调用了close()
,数据一定会写入硬盘,无需手动flush()
。- 小文件写入:如果写入的数据量小,缓冲区很快填满,系统会自动刷新。
- 程序正常退出:Python 在程序结束时会自动刷新所有缓冲区
刷新步骤
# 1 打开文件
file = open("XX")
# 2 读取
text = file.read()
# 3 刷新
flie.flush()
# 4 关闭
file.close() # 千万不要忘记关闭文件