文章目录
简介
文件的读写俗称IO操作,其流程可以简单概括为:Python操作文件–>打开或新建文件–>读、写文件–>关闭资源。
基础
文件操作的三个要素
如果需要使用Python操作文件需要满足以下几个条件:
文件名:通过绝对路径与相对路径获取文件名
文件打开方式:例如读取、写入、追加内容
编码方式:需要确定文件的编码方式,这样可以确保在写入或读取时不会变成乱码。
下面是几个常见的操作系统中默认的编码方式:
操作系统默认编码 | 编码 |
---|---|
Windows | gbk |
Linux | utf-8 |
Mac | utf-8 |
文件操作模式
对文件的操作又称之为对文件句柄的操作,在Python中,文件操作模式有以下几种:
文件操作模式 | 说明 |
---|---|
r | 以只读的形式打开文件,默认就是r模式 |
w | 以只写的形式打开这个文件,如果这个文件存在就覆盖这个文件内容来写(先删除原内容在写),不存在就创建文件 |
a | 在文件后面追加内容,文件不存在创建文件 |
rb | 以只读的形式打开一个二进制文件 |
wb | 以只写的形式打开一个二进制文件,如果这个文件存在就覆盖这个文件来写东西(先删除原内容在写),否则创建文件 |
ab | 在一个二进制文件后面追加内容 ,文件不存在创建文件 |
r+ | 以读写的形式打开一个文件,如果这个文件不存在会报错 |
w+ | 以读写的形式打开一个文件,如果这个文件存在就覆盖这个文件内容来写(先删除原内容),不存在就创建文件 |
a+ | 以读写的形式打开文件可以在文件后面追加内容,文件不存在就创建 |
rb+ | 以读写的形式打开一个二进制文件,不存在就报错 |
wb+ | 以读写的形式打开一个二进制文件,如果这个文件存在就覆盖这个文件内容来写(先删除原内容在写),不存在就创建文件 |
ab+ | 以读写的形式打开二进制文件可以在文件后面追加内容 |
读文件
使用相对路径或者是绝对路径打开并读取
在本例中以a.txt的《再别康桥》为例,本例使用的是相对路径读取:
f=open('a.txt',encoding='utf-8',mode='r')#打开a.txt,指定编码和操作模式
f1=f.read()#读取文件
print(f1)
f.close()#读取完之后关闭文件
读取后的结果如下:
使用绝对路径,按照字符读取
实例如下:
f=open(r'D:\model_test\a.txt',encoding='utf-8',mode='r')#打开a.txt,指定编码和操作模式
f1=f.read(15)#读取文件
print(f1)
f.close()#读取完之后关闭文件
按行读取
实例如下所示:
f = open('a.txt',encoding='utf-8',mode='r')#打开a.txt,指定编码和操作模式
f1 = f.readline()#readline每次读取一行
print(f1)
f1 = f.readline()
print(f1)
f.close()#读取完之后关闭文件
多行读取
使用readlines可以很方便的多行读取数据,它会返回一个列表,每一个元素就是源文件的每一行。多行读取实例如下:
f = open('a.txt',encoding='utf-8',mode='r')#打开a.txt,指定编码和操作模式
f1=f.readlines()#readlines返回一个列表,列表的每一个元素是原文件的每一行
print(f1)
f.close()#读取完之后关闭文件
部分运行结果如下所示:
for循环读取文件
我们也可以使用for循环读取文件获得其中的数据:
f = open('a.txt',encoding='utf-8',mode='r')#打开a.txt,指定编码和操作模式
for i in f:
print(i)#在循环之中可以设置读取方式
f.close()#读取完之后关闭文件
写文件
文件中有四种写文件的模式,具体可见本文中表一。
下面就以下写入方式进行简单的实例练习:
文件不存在,创建并写入
f = open('b.txt',encoding='utf-8',mode='w')#打开a.txt,指定编码和操作模式
f1=f.write('智慧建筑,数字未来!中亿丰数字,城市数智化专家')
print(f1)
f.close()#读取完之后关闭文件
文件存在,清空原有内容再写入信息
代码与上例相同,仅需修改f.write之中的内容,如下所示:
f.write('中亿丰数字,城市数智化专家')
此时b.txt中,内容如下:
在文件中追加内容
文件的追加:a,ab,a+,ab+
下面以几个简单实例来演示:
此时b.txt中的内容:
输入以下代码:
f = open('b.txt',encoding='utf-8',mode='a')#打开a.txt,指定编码和操作模式
f1=f.write('。智慧建筑,数字未来')
print(f1)
f.close()#读取完之后关闭文件
运行结果如下所示:
读写先后问题
r+先读取再写入,倘若文件不存在,系统会返回错误值,如果在后面追加内容,那么运行不会产生问题。但如果先写入再读取,那么就会出现一些问题。
光标从前往后先写再读取,那么写多少就会覆盖多少,但是极有可能会出现乱码问题。
先读取再写入:
f=open('b.txt',encoding='utf-8',mode='r+')
f1=f.read()
#光标在哪里,就在那增加,因为你刚读取完毕所有,光标在最后面,所以就会在后面增加
print(f1)#举头望明月
f.write('智慧建筑,数字未来')
f.close()
先写入再读取:
f=open('b.txt',encoding='utf-8',mode='r+')
f.write('12智慧建筑,数字未来')
f1=f.read()
print(f1)
f.close()
可以看到文件中不仅覆盖了前文,而且出现了乱码
这是因为,一个文字在utf-8是3字节,换数字,一个数字1字节,1字节对应3字节,无法对应,就出错,甚至于其他符号;因为你写的时候是一个字符替换一个字符而不是替换一个编码。
光标获取
tell获取光标
tell():获取光标的位置,以字节为单位光标的位置跟读取的位置息息相关,与用户在运行代码前鼠标放置的位置没有关系。
f=open('b.txt',encoding='utf-8',)
print(f.tell())#tell根据字节获取光标,此时没有读取,光标的位置在0的位置,
f1=f.read(3)#读取三个字符中文之后,光标的位置就成了9,在utf-8中,一个中文3字节
print(f.tell())#此时光标的位置是9
f.close()
seek,寻找,调整光标
起始位置参数 | 说明 |
---|---|
0 | 光标在文件起始位置 |
1 | 光标在当前位置 |
2 | 光标在文件最后一个位置 |
下面是简单实例,在b.txt中,文件内容为:中亿丰数字,城市数智化专家。,下面是光标偏移后内容打印出来的效果变化:
f=open('b.txt',encoding='utf-8')
f.seek(0)#从第几个字节的光标开始往后,0就是从头开始,就是偏移量
print(f.read())#中亿丰数字,城市数智化专家。
f.seek(3)#偏移3字节
print(f.read())#亿丰数字,城市数智化专家。
f.close()