摘要: 本文主要是介绍python
的文件读写操作。
一.文件打开与关闭 1.文件读写的步骤
打开文件,或者新建立一个文件,获取文件描述符
读/写数据,操作文件描述符
关闭文件
文件读写操作完成后,应该及时关闭。一方面,文件对象会占用操作系统的资源;另外一方面,操作系统对同一时间能打开的文件描述符的数量是有限制的,在Linux
操作系统上可以通过ulimit -n
来查看这个显示数量。如果不及时关闭文件,还可能会造成数据丢失。
2.打开文件-open()函数 2.1 函数在库中的原型 python 1 2 3 4 5 6 def open (file: Union [str , bytes , int ], mode: str =..., buffering: int =..., encoding: Optional [str ]=..., errors: Optional [str ]=..., newline: Optional [str ]=..., closefd: bool =..., opener: Optional [Callable [[str , int ], int ]]=... )''' Open file and return a stream . Raise OSError upon failure .file is either a text or byte string giving the name (and the path if the file isn't in the current working directory) of the file to be opened or an integer file descriptor of the file to be wrapped. (If a file descriptor is given, it is closed when the returned I/O object is closed, unless closefd is set to False.) mode is an optional string that specifies the mode in which the file is opened. It defaults to ' r' which means open for reading in text mode. Other common values are ' w' for writing (truncating the file if it ' ''
参数
含义
file
要创建或打开文件的文件名称,该名称要用引号(单引号或双引号都可以)括起来。如果要打开的文件和当前执行的代码文件位于同一目录,则使用文件名即可;否则,此参数需要指定打开文件所在的完整路径。
mode
可选参数,用于指定文件的打开模式。如果不写,则默认以只读(r)的模式打开文件。
buffering
可选参数,用于指定对文件做读写操作时,是否使用缓冲区。
encoding
设定打开文件时所使用的编码格式,不同平台的 ecoding
参数值也不同,以 windows
为例,其默认为 cp936
(实际上就是GBK
编码)。
使用格式如下python 1 2 file1 = open ("E:\\MyStudy\\VScode\\Python\\files.txt" , "r" )
2.2 文件打开时访问模式(mode参数)
访问模式
说明
r
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。如果文件不存在会报错
w
打开一个文件只用于写入。如果文件存在则将其内容清空,如果文件不存在则创建新文件。
a
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
rb
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
wb
以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
r+
在r的基础上增加了可写功能。文件指针将会放在文件的开头。
如原来文件内容是"hello",打开文件后写入"abcd"则文件内容会变成"abcdo"。
w+
在w的基础上增加了可读功能。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。在打开文件时就会先将文件内容清空。
.
a+
在a的基础上增加了可读功能。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。a+只能写到文件末尾(无论当前文件指针在哪里)
rb+
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
wb+
以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
ab+
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
3.关闭文件-close()函数
python 1 2 def close (self ) -> None : pass
说明 close()
方法用于关闭一个已打开的文件。关闭后的文件不能再进行读写操作, 否则会触发ValueError
错误。
使用格式
python
二.文件相关的函数 以下出现的指针,都表示文件读取位置,因为在C语言中叫习惯了,而且这个个人感觉比较形象,所以下边就这样用了。
1.写数据write() 1.1 函数说明
python 1 2 def write (self, s: AnyStr ) -> int : pass
python
注意,在使用该函数的时候,打开的文件必须具有写的权限。
1.2 函数使用实例 提前创建文件,并写入数据,以区分不同写入模式的时候,对文件的影响,由于以w
模式打开文件,会直接清除所有数据,所以将其作为最后一个实例。
2.读文件函数read() 2.1 函数说明
python 1 2 def read (self, n: int = -1 ) -> AnyStr: pass
python
函数的参数为整型,若不写,则默认读取文件中所有数据,返回值为读取到的数据,为字符串类型。
2.2 函数使用实例
python 1 2 3 4 5 file1 = open ("E:\\MyStudy\\VScode\\Python\\files.txt" , "r" ) data = file1.read() print (type (data)) print (data) file1.close()
python 1 2 3 4 5 6 file1 = open ("E:\\MyStudy\\VScode\\Python\\files.txt" , "r" ) data = file1.read(15 ) print (type (data)) print (len (data)) print (data) file1.close()
由打印数据可得,一共读取了12个字符,但是实际长度有15,原因在于读取了3个换行符号。
3.读文件函数readline() 3.1 函数说明
python 1 2 def readline (self, limit: int = -1 ) -> AnyStr: pass
python 1 data = file1.readline(num)
num
:函数参数,该参数不写,表示读取整行数据,并把文件指针移到下一行开头,若指定了数字,则该数字必须为整数,且把num
个字节数据当作一行,把指针移到num
后面的位置,下一次便从这里开始读取,这样就会出现一行当作多行使用。data
:读取到的数据存放的变量名,该数据会是一个字符串类型的数据。
3.2 函数使用实例
python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 file1 = open ("E:\\MyStudy\\VScode\\Python\\files.txt" , "r" ) data1 = file1.readline() data2 = file1.readline() data3 = file1.readline() data4 = file1.readline() print (type (data1)) print (len (data1)) print (data1) print (type (data2)) print (len (data2)) print (data2) print (type (data3)) print (len (data3)) print (data3) print (type (data4)) print (len (data4)) print (data4) file1.close()
python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 file1 = open ("E:\\MyStudy\\VScode\\Python\\files.txt" , "r" ) data1 = file1.readline(10 ) data2 = file1.readline(8 ) data3 = file1.readline() data4 = file1.readline() print (type (data1)) print (len (data1)) print (data1) print (type (data2)) print (len (data2)) print (data2) print (type (data3)) print (len (data3)) print (data3) print (type (data4)) print (len (data4)) print (data4) file1.close()
由打印数据可知,最后第一行数据被进行了拆分,只读取了相应字节数据。
4.读文件函数readlines() 4.1 函数说明
python 1 2 def readlines (self, hint: int = -1 ) -> List [AnyStr]: pass
python 1 data = file1.readlines(num)
data
:读取到的数据存放的变量名,该数据会是一个列表类型的数据,该函数读取文件中的所有行,每行的数据都是字符串,这些字符串又被组成一个列表。num
:函数参数,该参数不写或者num=0
,表示按行读取文件中所有数据,包含换行符,最后再将所有数据整合成列表,当num
写了,且不为0时,该函数功能与readline
一致,只读取一行,且将指针移到下一行开头,但是不同的是,该函数输出的是列表类型数据。
4.2 函数使用实例
python 1 2 3 4 5 6 7 8 file1 = open ("E:\\MyStudy\\VScode\\Python\\files.txt" , "r" ) data1 = file1.readlines() data2 = file1.readlines() print (type (data1)) print (data1) print (type (data2)) print (data2) file1.close()
第二次读取输出列表为空,说明第一次读取完毕后,函数将文件指针移到了结尾。
为节省空间,不做重复工作,这里只做了一个。
python 1 2 3 4 5 6 7 8 file1 = open ("E:\\MyStudy\\VScode\\Python\\files.txt" , "r" ) data1 = file1.readlines(3 ) data2 = file1.readlines(0 ) print (type (data1)) print (data1) print (type (data2)) print (data2) file1.close()
第一次参数为3,只读取了一行,第二次参数为0,读取了剩下所有数据。
5.文件读取位置函数tell() 5.1 函数说明
python 1 2 def tell (self ) -> int : pass
python
注意:该函数用于readlines()
函数后的时候,readlines()
不能有参数,参数最多只能是0,否则出错。
5.2 函数使用实例
python 1 2 3 4 5 6 7 8 9 10 11 12 13 file1 = open ("E:\\MyStudy\\VScode\\Python\\files.txt" , "r" ) data1 = file1.read(3 ) print (file1.tell()) print (type (file1.tell())) print (data1) data2 = file1.readline() print (file1.tell())print (type (file1.tell()))print (len (data2)) print (data2) file1.close()
6.设置文件读取位置函数seek() 6.1 函数说明
python 1 2 def seek (self, offset: int , whence: int = 0 ) -> int : pass
python 1 file1.seek(offset, from )
参数
说明
offset
偏移量
from
方向: 0:表示文件开头;1:表示当前位置;2:表示文件末尾 (注意次参数为2的时候,偏移量只能为负数或者0,在python3中该函数不支持复数,要注意)
6.2 函数使用实例
python 1 2 3 4 5 6 7 file1 = open ("E:\\MyStudy\\VScode\\Python\\files.txt" , "r" ) file1.seek(5 , 0 ) print (file1.tell()) data = file1.read(3 ) print (data)print (file1.tell()) file1.close()
python 1 2 3 4 5 6 7 file1 = open ("E:\\MyStudy\\VScode\\Python\\files.txt" , "r" ) file1.seek(-5 , 2 ) print (file1.tell()) data = file1.read(3 ) print (data)print (file1.tell()) file1.close()
未完,待续。。。。。。