关于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()语句,则打开文件发现没有任何数据:

如果写入语句处于代码的末尾,则执行后自动清空缓冲区,将数据写入文件:

posted @ 2022-11-30 22:41  天青色wy  阅读(130)  评论(0编辑  收藏  举报