关于python文件处理
在 Python 中,如果想要操作文件,首先需要创建或者打开指定的文件,并创建一个文件对象,而这些工作可以通过内置的 open() 函数实现。
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True) 函数用于创建或打开指定文件。
- file:要创建或打开文件的文件名称,该名称要用引号(单引号或双引号都可以)括起来。需要注意的是,如果要打开的文件和当前执行的代码文件位于同一目录,则直接写文件名即可;否则,此参数需要指定打开文件所在的完整路径。
- mode:可选参数,用于指定文件的打开模式。如果不写,则默认以只读(r)模式打开文件。
- buffering:可选参数,用于指定对文件做读写操作时,是否使用缓冲区。
- encoding:手动设定打开文件时所使用的编码格式,不同平台的 ecoding 参数值也不同,以 Windows 为例,其默认为 cp936(实际上就是 GBK 编码)。
模式 |
含义 |
注意事项 |
r |
只读模式打开文件,读文件内容的指针会放在文件的开头。 |
操作的文件必须存在。 |
rb |
以二进制格式、采用只读模式打开文件,读文件内容的指针位于文件的开头,一般用于非文本文件,如图片文件、音频文件等。 |
|
r+ |
打开文件后,既可以从头读取文件内容,也可以从开头向文件中写入新的内容,写入的新内容会覆盖文件中等长度的原有内容。 |
|
rb+ |
以二进制格式、采用读写模式打开文件,读写文件的指针会放在文件的开头,通常针对非文本文件(如音频文件)。 |
|
w |
以只写模式打开文件,若该文件存在,打开时会清空文件中原有的内容。 |
若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。 |
wb |
以二进制格式、只写模式打开文件,一般用于非文本文件(如音频文件) |
|
w+ |
打开文件后,会对原有内容进行清空,并对该文件有读写权限。 |
|
wb+ |
以二进制格式、读写模式打开文件,一般用于非文本文件 |
|
a |
以追加模式打开一个文件,对文件只有写入权限,如果文件已经存在,文件指针将放在文件的末尾(即新写入内容会位于已有内容之后);反之,则会创建新文件。 |
|
ab |
以二进制格式打开文件,并采用追加模式,对文件只有写权限。如果该文件已存在,文件指针位于文件末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 |
|
a+ |
以读写模式打开文件;如果文件存在,文件指针放在文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 |
|
ab+ |
以二进制模式打开文件,并采用追加模式,对文件具有读写权限,如果文件存在,则文件指针位于文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 |
w清空写,w+清空写和读;
a追加写, a+追加写和读;
r只读, r+覆盖写和读。
注意:对于文件中的数据,以 b 模式(二进制)打开,文件指针的数据单位是字节;以普通模式打开,文件指针的数据单位是字符。
tell()函数:返回文件指针当前所处的位置(单位为字节)。
seek(self, offset: int, whence: int = 0) 函数:指定文件指针位置(单位是字节)。
offset偏移量,正数向后偏移,负数向前偏移;
whence表示从何处偏移,默认0文件开头,1当前位置,2文件末尾。
当 offset 值非 0 时,Python 要求文件必须要以二进制格式打开,否则会抛出 io.UnsupportedOperation 错误。
读取报错:
注意tell()和seek()的数据单位均为字节,而read()在普通模式中打开的数据单位为字符。因为utf8中三个字节表示一个字符,,seek到字节2,自然无法输出。如果换成seek(3),就可以了。
read(self[,n])函数:读取文件内容,默认参数n=-1,表示读取所有,可指定参数,表示读取n个字符(b模式为字节)。
注意:使用 open() 函数指定打开文件的模式必须为可读模式(包括 r、rb、r+、rb+ 、a+)才能读取到文件数据。如果是w+,打开文件时数据就被清空了;如果是a+,打开文件时指针置于末尾,要用seek()函数移动指针后才能读取。
readline([limit])函数:读取文件指针右侧的一行数据,包括换行符。参数limit表示读取字符(b模式为字节)的个数。
readlines([hint]) 函数用于读取文件中的所有行,它和调用不指定参数的 read() 函数类似,只不过该函数返回是一个字符串列表,其中每个元素为文件中的一行内容。
注意参数hint的含义,hint 参数用来限制返回的行数。如果返回的字符(字节)总数超过了指定的数目,则不会再返回后面的任何行。有点魔幻。
以我的文本文件为例,每一行5个字符,若hint=4,当返回第一行的时候,总共5个字符,大于4,所以不会返回后面的任何行。若hint=5,则先返回第一行整行五个字符,但5不大于5,继续返回第二行整行,此时发现有10个字符了,10大于5,则不会返回后面的任何行。
write(AnyStr)函数,向文件中写入数据。AnyStr表示任何字符串或者字节串,但不能混合str和bytes。
writelines(lines)函数,多行写入。参数lines为可迭代对象,如列表元组。其中的每个元素表示一行。
close()函数用来关闭已打开的文件。文件打开操作完毕后就要关闭,关闭之后才能将缓存区的内容写入磁盘。
with ... [as ...]: with as 语句用来打开某个文件而不用手动close(),在执行完代码块后自行关闭文件。
缓冲区:
当我们向文件中写入数据时,系统会先将数据临时存储到缓冲区(内存)中,只有使用 close() 函数关闭文件时,才会将缓冲区中的数据真正写入文件中(硬盘)。
比如下面的情况,没有执行close()语句,则打开文件发现没有任何数据:
如果写入语句处于代码的末尾,则执行后自动清空缓冲区,将数据写入文件:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY