文件操作详解
一、文件操作背景知识
首先要知道一个大前提,计算机体系分为三层:应用程序,操作系统,计算机硬件。操作系统控制复杂的硬件操作,而后会留给应用程序一个简单方便的接口,应用程序只需要通过这个接口,就可以实现对硬件的操作。
操作系统控制硬盘来对数据进行读取和写入,而这个复杂的操作留给应用程序 的接口就是文件。文件是一个虚拟的概念。
二、文件操作三步走
既然弄清楚文件这一概念了,就可以说一下具体操作流程了。
2.1 打开文件
本质就是通过打开操作系统提供的文件概念来操作计算机的硬盘来读取和写入数据,在硬盘上是一堆二进制数字。打开文件的方法是用open()。
# 打开文件的语法如下:
f = open("文件的地址",mode="r",encoding="utf-8")
2.2 读、写文件
以utf-8格式的文件为例。读文件的本质就是通过接口,将硬盘中的二进制数进行解码成Unicode,然后在解码成我们能看懂的字符。写就是编码成uft-8的二进制数保存在硬盘上。
2.3 关闭文件
当打开文件的时候,会让操作系统打开文件,同时变量f存储在应用程序的内存空间中,当我们操作完毕后,就必须把文件关闭来解放被占用的操作系统资源,一般我们都是用f.close()的方法进行关闭,另外为避免忘记关闭文件,还有一种with语句可以在处理完毕后,自动对文件进行关闭。
# 关闭文件方法一
f = open("文件地址",mode="r",encoding="utf-8")
f.close()
# 关闭文件方法二:操作完毕之后,不用进行任何处理。
with open("文件地址",mode="r",encoding="utf-8") as f:
f.read()
三、文件模式详解
那么Python语法中的那个mode又是什么呢?
打开文件的模式一共有两种:
3.1 t模式
t模式主要有以下特点
-
只能打开文本文件,
-
读写都是以str(unicode格式的二进制)为单位的,
-
需指定解码格式。不指定则是默认操作系统的编码格式。
必须和r,w,a连用,即rt,wt,at。但是通常是默认为t模式,可以选择只填写r,w,a。
-
r:只读模式,文件不存在则报错,当文件打开之后,指针会到起始位置2
-
w:写模式。文件不存在则重新创建,存在则清空内容。
-
a:追加模式。文件不存在则创建,存在则将内容写在文件的末尾。文件打开之后,指针会到末尾位置。
-
+:必须与r,w,a连用,可读可写。但是不推荐使用。
3.2 b模式
即二进制模式,不用指定编码方式。t模式值处理文本类型,其他诸如图片,音频都是采用的b模式。但是文件必须得对二进制数进行编码和解码。
其实,b模式是打开文件最基本的方式,而t模式只是针对文本文件,在打开后,对存在硬盘中的二进制数按照指定的格式进行解码,而图片,文本因为不是字符编码,所以不能指定encoding。
- 可以针对任意类型的文件
- 读写是以bytes为单位进行的
- 一定不能指定encoding.
当然,它也必须和r,w,a模式连用。
四、文件操作的方法
当我们用相应的模式打开文件的时候,指针都默认处于固定的位置,那如果我们想知道指针处于那个位置,或者把指针移到某个位置应该如何进行呢?这时候就要考虑用到tell()和seek()了。
f.tell()可以告诉我们指针位于第几个字节。
f.seek()是可以把指针移动到对应的位置。seek一共接受两个参数,第一个参数是指定字节数,第二个是指定模式。
- 0模式。参照文件开头开始移动对应的字节数。
- 1模式。从指针当前位置开始移动。
- 2模式。从文件末尾开始往前数,因此,第一个参数必须是负数。
这三个模式都可以在b模式下应用。只有0模式可以在t模式下应用。
还有一些其他方法。
方法 | 功能 |
---|---|
f.read() | 一次性读取全部信息 |
f.readline() | 读取文件一行信息,以换行符为标识 |
f.readlines() | 将每行信息当做元素,返回一个列表 |
f.write() | 将信息写入文件 |
f.writelines() | 将列表的信息循环写入文件。如果没有换行符就写一行 |
五、修改文件的方法
修改文件一共有两种方法。
# 第一种:直接式:干就完了
# 即先将文件数据都读取到内存,然后在写入文件。
# 首先将数据读到内存
with open("a.txt","r") as f:
data = f.read()
# 对内存中的数据进行修改
data = data.replace("1","2")
# 将修改后的数据写进新的文件
with open("a.txt","w") as f:
f.write(data)
# 第二种:李代桃僵式:我不是我,是不一样的烟火
# 将文件的内容逐行读取并写入新的文件,然后将源文件删除,新文件改名。
import os
# 打开源文件和复制后的文件,并将数据写入新文件
with open("a.txt","r") as f,open(".a.txt.swap","w") as f1:
for line in f:
line = line.replace("1","2")
f1.write(line)
# 将源文件删除
os.remove("a.txt")
os.renames(".a.txt.swap","a.txt")