摘要:
  本文主要是介绍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
    # 打开一个文件,注意windows下文件路径要用转义符号保留 \ 
    file1 = open("E:\\MyStudy\\VScode\\Python\\files.txt", "r") # file1:表示要创建的文件对象,它将包含文件的各种信息

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
1
2
# 上边以file1作为文件对象打开了一个文件
flie1.close() # 关闭刚才打开的文件

二.文件相关的函数

  以下出现的指针,都表示文件读取位置,因为在C语言中叫习惯了,而且这个个人感觉比较形象,所以下边就这样用了。

1.写数据write()

1.1 函数说明

  • 函数原型
python
1
2
def write(self, s: AnyStr) -> int:
pass
  • 使用格式
python
1
file1.write("string")  # 打开文件之后,将字符串写入文件。

  注意,在使用该函数的时候,打开的文件必须具有写的权限。

1.2 函数使用实例

  提前创建文件,并写入数据,以区分不同写入模式的时候,对文件的影响,由于以w模式打开文件,会直接清除所有数据,所以将其作为最后一个实例。

  • 初始文件内容如下
  • r+打开文件后写入

    python
    1
    2
    3
    file1 = open("E:\\MyStudy\\VScode\\Python\\files.txt", "r+")  # r+格式打开文件
    file1.write("Hello World") # 写入数据
    file1.close() # 关闭文件
  • a+打开文件后写入

    python
    1
    2
    3
    file1 = open("E:\\MyStudy\\VScode\\Python\\files.txt", "a+")  # a+格式打开文件
    file1.write("Hello World") # 写入数据
    file1.close() # 关闭文件
  • w+打开文件后写入

    python
    1
    2
    3
    file1 = open("E:\\MyStudy\\VScode\\Python\\files.txt", "w+")  # w+格式打开文件
    file1.write("Hello World") # 写入数据
    file1.close() # 关闭文件
  • 总结
      由上述三个例子可以看出三者区别,r+打开,会将指针放在开头,向后覆盖数据,a+会将指针放在末尾,从末尾添加数据,而w+打开,直接先清除所有数据,再从开头写入数据。

2.读文件函数read()

2.1 函数说明

  • 函数原型
python
1
2
def read(self, n: int = -1) -> AnyStr:
pass
  • 使用格式
python
1
file1.read(num)  # 以读的权限打开文件后,对文件读取,num为整型数字,意义为读取字节数

  函数的参数为整型,若不写,则默认读取文件中所有数据,返回值为读取到的数据,为字符串类型。

2.2 函数使用实例

  • 文件中原始数据如下
  • 读取全部数据
python
1
2
3
4
5
file1 = open("E:\\MyStudy\\VScode\\Python\\files.txt", "r")  # 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")  # r格式打开文件
data = file1.read(15) # 读取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")  # 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")  # 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)  # 读取文件中所有数据,返回值为列表,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")  # r格式打开文件
data1 = file1.readlines() # 第一次读取
data2 = file1.readlines() # 第二次读取
print(type(data1)) # 打印读取的数据类型
print(data1) # 打印读取的数据
print(type(data2)) # 打印读取的数据类型
print(data2) # 打印读取的数据
file1.close() # 关闭文件

  第二次读取输出列表为空,说明第一次读取完毕后,函数将文件指针移到了结尾。

  • 有参数,0与非0的区别

  为节省空间,不做重复工作,这里只做了一个。

python
1
2
3
4
5
6
7
8
file1 = open("E:\\MyStudy\\VScode\\Python\\files.txt", "r")  # 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
1
file1.tell() # 读取文件当前读写位置,返回值为int型
  • 注意:该函数用于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")  # r格式打开文件
data1 = file1.read(3) # 第一次读取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")  # r格式打开文件
file1.seek(5, 0) # 设置位置为开头偏移5字节
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")  # r格式打开文件
file1.seek(-5, 2) # 设置位置为结尾向左5字节
print(file1.tell()) # 打印当前文件读写位置
data = file1.read(3) # 读取三个字节数据
print(data)
print(file1.tell()) # 打印当前文件读写位置
file1.close() # 关闭文件

  未完,待续。。。。。。