一、前言
上一节,我们在代码示例的最后,给大家说了,我们的代码只需要添加字典中的职员信息,就可以完成快速的人员添加,但这样仍然不够完美,我们在这一节中给大家介绍文件的使用,我们既可以通过文件读取我们之前存储的信息,也可以写入我们想要保存的东西
二、文件的基本读写
1、文件的基本操作
在写入之前,我们首先需要打开一个文件,这个文件可以是新建的,也可以是已存的,打开文件使用open方法,需要填入打开的模式,如你需要是写,是读,还是再后面追加,常用的模式如下
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头 |
rb | 以二进制方式打开文件用于只读。文件的指针将会放在文件的开头 |
rb+ | 以二进制方式打开文件用于读写。文件的指针将会放在文件的开头 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制方式打开文件用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制方式打开文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
2、不同文件模式的使用
接下来我们分别使用上述不同的模式进行写入,帮助大家理解
r模式
# 只读模式下,需要有一个已有文件才能够正常执行,如果我当前目录没有下面代码中要打开的test.txt文件,在运行代码时会报错
f = open('test.txt', 'r')
data = f.read()
print(data)
f.close()
结果: Traceback (most recent call last):
File "F:/Test/hello.py", line 2, in <module>
f = open('test.txt', 'r')
FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'
# 我们首先在当前目录创建一个test.txt文件,里面填入hello字符串,然后再使用上面代码读取
f = open('test.txt', 'r')
data = f.read() # 读取文件对象中的所有内容
print(data)
f.close()
结果: hello
rb模式
# 我们仍然读取test.txt,不同的是,我们将模式由r改为rb,可以看到,输出的结果,前面多了一个b,这代表字节流,后面的章节我们会详细介绍
f = open('test.txt', 'rb')
data = f.read()
print(data)
f.close()
结果: b'hello'
r+模式
# 我们使用r+模式,就可以写入文件了,通过如果代码,就可以将我们之前的hello改写为world(注意:由于所有的r模式的光标都是从头开始的,所以文件之前不管有什么内容,都会被擦除,这点要注意),rb+在这里就不介绍了,只是r+是普通文本,rb+是字节流
f = open('test.txt', 'r+')
f.write('hello world') # write是写入文件的方法
f.seek(0) # seek是设置文件的光标位置,我们在上一行write之后,光标会挪到文件的最后,我们要读取的话,就要先把光标移到0位
data = f.read()
print(data)
f.close()
结果: hello world
w模式
# 我们使用w模式,与r模式不同的是,若当前没有test.txt这个文件,w模式会自动创建一个并往里写入hello,所以下面代码执行完成后,在当前文件夹下会多一个test.txt文件出来,里面会有hello字符串
f = open('test.txt', 'w')
f.write('hello')
f.close()
w+模式
# 我们使用w+模式,首先创建test.txt文件并写入hello world,然后读取并显示,wb和wb+模式原理一样,只是内容是字节流,我们不再单独举例
f = open('test.txt', 'w+')
f.write('hello world')
f.seek(0)
data = f.read()
print(data)
f.close()
结果: hello world
a模式
# 我们已有一个test.txt文件,里面有一行内容hello world,我们使用a模式进行追加,追加完成后test.txt文件内容变成hello world Donnie
f = open('test.txt', 'a')
f.write(' Donnie')
f.close()
a+模式
# 我们设置为a+模式,在已有内容hello world后追加字符串,然后读取并打印
f = open('test.txt', 'a+')
f.write(' Donnie')
f.seek(0)
data = f.read()
print(data)
f.close()
结果: hello world Donnie
3、文件的其他操作
重命名文件
# 重命名文件test1.txt到test2.txt。
import os
os.rename( "test1.txt", "test2.txt" )
删除文件
# 删除test1.txt文件
import os
os.remove( "test1.txt")
三、配置文件
就像我们开头所说的那样,我们可以将员工的信息放入到配置文件当中,我们每次读取员工的配置文件即可,这样也可以保证代码的统一性
常见的配置文件有xml,json,conf,ini等,我们今天给大家介绍ini配置文件,其余的大家有兴趣可以自己研究
1、基本格式
ini配置文件基本格式由section和key,value组成,格式如下:
# section不可重复,为唯一值
[section]
key1 = value1
key2 = value2
[section2]
key1 = value1
key2 = value2
2、读取
我们现有一个ini配置文件,内容如下:
[dog]
name= 'GuGu'
age= 3
[cat]
name= 'HaHa'
age= 7
[fish]
name= 'BuBu'
age= 4
读取的话,要使用configparser库,代码如下:
import configparser
# 创建管理对象
conf = configparser.ConfigParser()
# 读ini文件
conf.read('test.ini', encoding="utf-8")
# 获取所有的section,list格式
sections = conf.sections()
# 打印所有的section
print(sections)
# 打印指定的value值,使用get方法,第一个参数为所属的section,第二个参数为所属的key
print(conf.get('dog', 'name'))
print(conf.get('cat', 'age'))
print(conf.get('fish', 'age'))
结果: ['dog', 'cat', 'fish']
'GuGu'
7
4
3、增删改
增
import configparser
# 创建管理对象
conf = configparser.ConfigParser()
# 读ini文件
conf.read('test.ini', encoding="utf-8")
# 添加一个名字为man的section
conf.add_section("man")
print(conf.sections())
# 往刚才添加的section添加key和value
conf.set("man", "name", "\'Donnie\'")
print(conf.get('man', 'name'))
# 使用write方法才会将刚才修改的东西保存下来
conf.write(open('test.ini', "w"))
结果: ['dog', 'cat', 'fish', 'man']
'Donnie'
修改后的test.ini文件:
[dog]
name = 'GuGu'
age = 3
[cat]
name = 'HaHa'
age = 7
[fish]
name = 'BuBu'
age = 4
[man]
name = 'Donnie'
删
# 将刚才创建的
import configparser
# 创建管理对象
conf = configparser.ConfigParser()
# 读ini文件
conf.read('test.ini', encoding="utf-8")
# 添加section
conf.add_section("man")
print(conf.sections())
结果: ['dog', 'cat', 'fish', 'man']
修改后的test.ini文件:
[dog]
name = 'GuGu'
age = 3
[cat]
name = 'HaHa'
age = 7
[fish]
name = 'BuBu'
age = 4
[man]
name = John
改
# 我们将刚才添加的Donnie改为John
import configparser
# 创建管理对象
conf = configparser.ConfigParser()
# 读ini文件
conf.read('test.ini', encoding="utf-8")
# 使用set方法将man中的Donnie改为John
conf.set('man', 'name', 'John')
print(conf.get('man', 'name'))
# 使用write方法才会将刚才修改的东西保存下来
conf.write(open('test.ini', "w"))
结果: John
修改后的test.ini文件:
[dog]
name = 'GuGu'
age = 3
[cat]
name = 'HaHa'
age = 7
[fish]
name = 'BuBu'
age = 4
四、总结
我们今天讲了文件的基本读写,以及ini配置文件的使用,通过今天的讲解,大家在写代码的过程中,就可以将自己的重要数据,或者一些可配置项,通过文件的方法进行记录或者配置,这样就可以在不用更改代码的情况下,实现我们多种多样不同的功能。
在我们刚才的例子中,以及大家平常在写代码的过程中,经常会出现代码报错的情况,出现报错后程序就停了,但不是所有的错误都需要我们及时去处理,那我们就可以使用异常处理机制,通过异常可以保证异常信息的及时记录,还能保证程序不会因为异常而退出,那么在下一章让我们认识一下异常处理这个强大的功能吧