Python教程--文件的读写

一、前言

上一节,我们在代码示例的最后,给大家说了,我们的代码只需要添加字典中的职员信息,就可以完成快速的人员添加,但这样仍然不够完美,我们在这一节中给大家介绍文件的使用,我们既可以通过文件读取我们之前存储的信息,也可以写入我们想要保存的东西

二、文件的基本读写

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配置文件的使用,通过今天的讲解,大家在写代码的过程中,就可以将自己的重要数据,或者一些可配置项,通过文件的方法进行记录或者配置,这样就可以在不用更改代码的情况下,实现我们多种多样不同的功能。
在我们刚才的例子中,以及大家平常在写代码的过程中,经常会出现代码报错的情况,出现报错后程序就停了,但不是所有的错误都需要我们及时去处理,那我们就可以使用异常处理机制,通过异常可以保证异常信息的及时记录,还能保证程序不会因为异常而退出,那么在下一章让我们认识一下异常处理这个强大的功能吧

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值