python-22-一篇文章帮助你彻底掌握python文件操作
一.简介
终于来到python基础系列中的python文件操作,这一概念我准备先介绍一些基础,后续系列文章我将会用python来实现一个音乐播放器,实现读取我们自己电脑里面的音乐文件!打造专属于我们自己的音乐播放器!好!回到现实,活在当下!来开始我们今天的日拱一卒!
二.文件读取的基本步骤
-
打开文件:使用
open()
函数打开文件。它返回一个文件对象,通过这个文件对象可以进行后续的操作。 -
读取文件内容:通过文件对象的相关方法读取文件内容。
-
关闭文件:文件操作完成后,应当关闭文件以释放系统资源。
-
open内建函数:open(file [, mode=‘r’, encoding=None, errors=None])
file:文件路径,可以是相对路径和绝对路径
mode:文件打开模式
encodeing: 文件编码方式,不用于二进制文件,一般是utf-8,gbk
errors:指定如何处理编码和解码错误 ,适用于文本文件
返回值:一个可迭代的文件对象
三.文件读取的常见模式
-
'r'
:只读模式(默认)。如果文件不存在,则抛出异常。 -
'w'
:写入模式。会覆盖文件原有内容,文件不存在则会创建新文件。 -
'a'
:追加模式。向文件末尾添加内容,文件不存在则会创建新文件。 -
'rb'
或'wb'
:二进制模式(如读取图片、音频等非文本文件)。
四.常用读取方式
-
read(size)
:读取指定大小的内容,如果没有指定大小,则读取整个文件。 -
readline()
:读取文件的一行。 -
readlines()
:读取文件的所有行,返回一个列表。
示例:
- 读取文件全部内容
#打开文件
fp = open('.\example.txt','r',encoding='utf-8')
#读取文件全部内容
content = fp.read()
print(content)
fp.close()
'''
输出:
每天进步一点点!
逐日月不拘于人海万千!~~~
'''
- 读取文件指定字符数
#打开文件
fp = open('.\example.txt','r',encoding='utf-8')
#读取文件指定字符数
content = fp.read(5)
print(content)
fp.close()
'''
输出:
每天进步一
'''
- 读取一行
#打开文件
fp = open('.\example.txt','r',encoding='utf-8')
#读取一行
content = fp.readline()
print(content)
fp.close()
'''
输出:
每天进步一点点!
'''
- 读取一行指定字符数
#打开文件
fp = open('.\example.txt','r',encoding='utf-8')
#读取一行指定字符数
content = fp.readline(5)
print(content)
fp.close()
'''
输出:
每天进步一
'''
- 读取所有行 返回为列表
#打开文件
fp = open('.\example.txt','r',encoding='utf-8')
#读取所有行 返回为列表
content = fp.readlines()
print(content)
fp.close()
'''
输出:
['每天进步一点点!\n', '逐日月不拘于人海万千!~~~']
'''
- 使用with 语句,它是一个上下文管理器,可以自动处理文件打开和关闭的问题,确保即使发生异常也能正确关闭文件,所以我们可以简写读取文件代码;
with open('.\example.txt', 'r',encoding='utf-8') as file:
lines = file.readlines() # 读取所有行,返回一个列表
print(lines)
'''
输出:
['每天进步一点点!\n', '逐日月不拘于人海万千!~~~']
'''
- 异常处理
try:
with open('non_existent_file.txt', 'r') as file:
content = file.read()
except FileNotFoundError:
print("文件不存在!")
'''
输出:
文件不存在!
'''
上面介绍了读取文件的常用方法,那么读取大文件又该怎么处理?如果读取的文件大于内存呢?over!完蛋。。
针对大文件的读取,还是切片!!把大文件分割成若干小文件处理,处理完每个小文件释放这部分内存即可!
示例
- 按行读取 (
readline()
或for
循环)
# 打开一个超大文件
with open('large_file.txt', 'r') as file:
for line in file: # 每次读取一行
# 处理每一行的数据
print(line.strip()) # strip() 去除末尾的换行符
- 按块读取 (
read(size)
或readinto()
)
# 每次读取1000字节
with open('large_file.txt', 'r') as file:
while True:
chunk = file.read(1000) # 每次读取1000个字符
if not chunk:
break # 如果读取完毕,退出循环
# 处理读取到的数据
print(chunk)
- 使用
mmap
模块进行内存映射
import mmap
with open('large_file.txt', 'r') as file:
# 使用 mmap 对文件进行内存映射
mmapped_file = mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ)
# 按块读取文件内容
for i in range(0, len(mmapped_file), 1000):
chunk = mmapped_file[i:i+1000]
# 处理 chunk 内容
print(chunk.decode('utf-8'))
mmapped_file.close()
- 使用生成器 (
yield
)
# 使用生成器逐行读取超大文件
def read_large_file(file_name):
with open(file_name, 'r') as file:
for line in file:
yield line.strip()
# 使用生成器处理文件
for line in read_large_file('large_file.txt'):
print(line)
五.写文件的基本步骤:
-
打开文件:使用
open()
函数,以适当的模式(如'w'
、'a'
等)打开文件。如果文件不存在,Python 会根据模式自动创建文件。 -
写入数据:通过文件对象的方法将数据写入文件。
-
关闭文件:操作完成后,关闭文件以确保数据被写入并释放资源。
六.常见的写入模式:
-
'w'
:写入模式。如果文件存在,它会被覆盖;如果文件不存在,则会创建一个新的文件。 -
'a'
:追加模式。如果文件存在,数据会被写入文件的末尾;如果文件不存在,则会创建一个新的文件。 -
'x'
:独占创建模式。如果文件已存在,会引发异常;如果文件不存在,Python 会创建一个新的文件并打开它。 -
'wb'
或'ab'
:二进制写入模式,通常用于写入非文本数据(如图片、音频文件等)。
七.文件写入的方法
-
write(string)
:将字符串写入文件。写入内容时不会自动换行。 -
writelines(list)
:将字符串列表写入文件,每个元素都会被按顺序写入。
示例:
- 使用
'w'
模式写入文件(覆盖写入)
# 打开文件进行写入(会覆盖文件原有内容)
with open('example.txt', 'w') as file:
file.write("Hello, Python!\n")
file.write("This is a file writing example.\n")
注意:当存在’example.txt’则覆盖里面内容
当不存在则新建’example.txt’文件并写入内容
- 使用
'a'
模式写入文件(追加写入)
# 打开文件进行追加写入(不会覆盖原有内容)
with open('example.txt', 'a') as file:
file.write("Appending new line to the file.\n")
注意:当存在’example.txt’则追加里面内容
当不存在则新建’example.txt’文件并写入内容
- 使用
'x'
模式写入文件(如果文件存在则引发异常)
try:
# 尝试使用 'x' 模式写入文件,如果文件已经存在则抛出异常
with open('example.txt', 'x') as file:
file.write("This will only write if the file doesn't exist.\n")
except FileExistsError:
print("文件已经存在,无法创建文件!")
- 使用
writelines()
写入多行数据,按照列表顺序写入
lines = [
"First line of text.\n",
"Second line of text.\n",
"Third line of text.\n"
]
# 使用 writelines() 写入多行数据
with open('example.txt', 'w') as file:
file.writelines(lines)
- 使用二进制模式写入文件(例如写入图片)
# 以二进制写入图片文件
with open('image.jpg', 'rb') as file:
data = file.read() # 读取二进制数据
# 假设我们修改了图像的内容并希望保存
with open('new_image.jpg', 'wb') as file:
file.write(data) # 将修改后的二进制数据写入新文件
八.文件打开模式 model
模式 | 描述 | 适用场景 |
---|---|---|
'r' | 只读模式 | 仅需读取文件,不会修改 |
'rb' | 只读二进制模式 | 读取二进制文件,如图片、音频等 |
'r+' | 读写模式 | 需要同时读取和修改文件 |
'rb+' | 读写二进制模式 | 同时读取和修改二进制文件 |
'w' | 写入模式 | 需要写入并覆盖文件内容 |
'wb' | 二进制写入模式 | 写入二进制文件 |
'w+' | 读写模式(覆盖) | 同时读取和写入文件,且覆盖文件 |
'wb+' | 二进制读写模式(覆盖) | 同时读取和写入二进制文件,且覆盖 |
'a' | 追加模式 | 追加数据到文件末尾 |
'ab' | 追加二进制模式 | 追加二进制数据到文件末尾 |
'a+' | 读写追加模式 | 同时读取和写入文件,并追加数据 |
'ab+' | 读写追加二进制模式 | 同时读取和写入二进制数据,并追加数据 |
'x' | 独占创建模式 | 确保文件不存在时创建新文件 |
'xb' | 独占创建二进制模式 | 确保文件不存在时创建新二进制文件 |
九.文件指针
1.获取当前文件指针位置**tell()
** — 获取当前文件指针的位置
with open('example.txt', 'r') as file:
content = file.read(10) # 读取前10个字符
print(file.tell()) # 输出文件指针当前的位置
2.移动文件指针位置
seek()
方法用于移动文件指针到指定的位置。该方法可以接收两个参数:
-
offset
:要移动的字节数,正值表示向前移动,负值表示向后移动。 -
whence
:指定移动的起始位置,默认值为 0,表示从文件的开头开始移动。常用的选项有:os.SEEK_SET
(默认值):从文件的开头开始计算偏移。os.SEEK_CUR
:从当前位置开始计算偏移。os.SEEK_END
:从文件的结尾开始计算偏移。
with open('example.txt', 'r') as file:
file.read(5) # 读取前5个字符
print(file.tell()) # 当前指针位置
file.seek(0) # 将指针移动到文件开头
print(file.tell()) # 输出:0
file.seek(3, os.SEEK_SET) # 从文件开头向后移动3个字节
print(file.tell()) # 输出:3
file.seek(-5, os.SEEK_END) # 从文件末尾向前移动5个字节
print(file.tell()) # 输出:文件的总长度 - 5
十.编码(Encoding)和解码(Decoding)
什么是编码和解码?
- 编码(Encoding) 是将字符串(文本)转换为字节(
bytes
)的过程。它是一个从字符到字节的转换过程,用于确保文本数据可以通过计算机存储、传输等方式进行处理。 - 解码(Decoding) 是将字节(
bytes
)转换回字符串(文本)的过程。它是一个从字节到字符的转换过程,用于恢复原始文本。
1.字符串编码str.encode(encoding) encoding为编码格式utf-8
, utf-16
, ascii
等
# 将字符串编码为字节
text = "Hello, World!"
encoded_text = text.encode('utf-8')
print(encoded_text) # 输出: b'Hello, World!'
2.字节解码bytes.decode(encoding) encoding为编码格式utf-8
, utf-16
, ascii
等 如果编码格式不匹配,会抛出 UnicodeDecodeError
# 将字节解码为字符串
encoded_text = b'Hello, World!' # 字节数据
decoded_text = encoded_text.decode('utf-8')
print(decoded_text) # 输出: 'Hello, World!'
九.总结
Python基础系列的文件读写,就介绍到这里,这应该是文件读写最为详细的一遍文章了!应该能帮助大家轻松掌握文件的读写!休息了,睡觉~~~
创作整理不易,请大家多多关注 多多点赞,有写的不对的地方欢迎大家补充,我来整理,再次感谢!