在之前写的程序中,数据都是临时保存在内存中的,程序一结束,这些数据所在的内存空间会全部释放,如果我们想要通过一个程序来加工并长期保存某个数据,就要用到对文件的操作。
在Python中,有关文件的常见操作有如下方法:
- 打开文件open
- 读取文件read
- 写入内容write
- 关闭文件close
一、打开文件
首先,需要一个变量来接收文件,并使用open关键字:
f = open(文件路径,模式,[编码方式])
确定好文件路径,以及打开的模式(只读还是可写),还有编码方式(可以不写,如果操作中出现乱码就要指定),那么一个文件对象就创建好了,我们的操作就都在这个变量 f 中进行。
假设我们文件的目录结构如下图所示:

在demo.py中,以下是几种常见的打开方式:
f = open("data.txt", 'r')
f2 = open("./datas/data2.txt", 'w', encoding='utf-8')
f3 = open("D:\Python_Projects\PythonProject\data.txt", 'w', encoding='utf-8')
f 是打开当前demo.py文件同一目录下的data.txt文件,f2 是使用相对路径的方式,在同一目录下的datas目录中打开data2.txt,f3 是使用绝对路径的方式打开与 f 相同的文件。注意文件名与路径都要用引号括起来,在相对路径中,“./” (点斜杠)表示当前目录,“../” (点点斜杠)表示上级目录,如果要多次返回上级目录,就多写几个“../”
有一个小技巧是在Pycharm或者其他IDE中,按住Ctrl键对准文件名,如果能点进去,说明这个文件是存在的或正确的。
第二个参数是指定打开的模式,常见的是只读模式"r"与写入模式"w",而且在写入模式的情况下打开一个不存在的文件,会自动新建一个空的文件,就比如下图的f4,可以看到,原本没有的data3.txt 文件被新建了。

其他打开文件的常用方式见下表,主要是二进制的读取方式,还有文件在编辑时的“光标”位置的差别,以及组合模式:
| 打开模式 | 描述 |
|---|---|
| r | 代表以只读模式打开一个已存在的文件,后续我们对这个文件只能进行读取操作。如果文件不存在,则直接报错。另外,r模式在打开文件时,会将光标放在文件的第一行(开始位置)。 这是默认模式 |
| rb | 以⼆进制格式打开⼀个文件⽤于只读。⽂件指针 将会放在⽂件的开头。 |
| r+ | 打开⼀个文件⽤于读写。文件指针将会放在文件的开头。 |
| rb+ | 以⼆进制格式打开⼀个文件⽤于读写。文件指针将会放在文件的开头。 |
| w | 打开⼀个文件只用于写⼊。如果该文件已存在则 打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
| wb | 以⼆进制格式打开⼀个文件只用于写⼊。如果该 文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
| w+ | 打开⼀个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删 除。如果该文件不存在,创建新文件。 |
| wb+ | 以⼆进制格式打开⼀个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
| a | 打开⼀个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说新的内容将会被写⼊到已有内容之后。如果该文件不存 在,创建新文件进行写⼊。 |
| ab | 以⼆进制格式打开⼀个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写⼊到已有内容之后。如果该文件不存在,创建新文件进⾏写⼊。 |
| a+ | 打开⼀个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读 写。 |
| ab+ | 以⼆进制格式打开⼀个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
其实常见的就三种模式:r、w、a,具体的应用要根据实际情况选择合适的模式,如果在实操中有跟描述不一致的地方,欢迎指出。
还需要注意的是,在以w模式打开文件时,该文件的所有内容会删掉,也就是说,以w模式打开文件,写入文件时会覆盖原文件。这点尤其要注意,以w模式打开文件只打开不写入的话,几乎等于把原文件删除了。
第三个参数就是指定编码方式,常见的编码方式有UTF-8,GBK,GB2312,ISO-8859-1等,如果打开的文件有乱码,就需要指定编码方式。
二、读取文件
常见的读取文件方法如下:
| 方法名 | 方法说明 |
| read() | 读取文件的所有内容 |
| read(大小) | 括号里写的数字是一次读取指定字符数量的内容 |
| readline() | 一次读取一行 |
| readlines() | 读取所有的行,返回一个列表 |
以下是 data.txt 文件的内容,它一共有四行,每一行的内容都较长,我将以此为基础来演示这些方法:

使用read()方法:
f = open("data.txt", 'r',encoding='utf-8')
print(f.read())
可以看见,f.read()的内容被打印出来时是所有的内容。

我们指定一次只读取10个字符,即把f.read()改成f.read(10):

可以看到,只读取了文本的前10个字符,注意,是字符数,而不是字节数。也许有些面试题会问到这些细节的东西。
指定字符数读取文件通常是在文件体积很大时使用,如何一次读取全部内容,会占用很大的内存空间,通常会和while循环一起使用来读取文件的所有内容,循环的条件就是是否读取到空字符串或读取的字符长度为0,这样就代表全部读完了:
f = open("data.txt", 'r', encoding='utf-8')
#f2 = open("./datas/data2.txt", 'w', encoding='utf-8')
#f3 = open("D:\Python_Projects\PythonProject\data.txt", 'w', encoding='utf-8')
#f4 = open("./datas/data3.txt", 'w', encoding='utf-8')
while True:
content = f.read(10)
print(content, end = "")
if len(content) == 0:
break
f.close()

可以看到使用一个简单的while True循环也能实现与read一样的效果。
在readlines方法中,返回的是一个字符串列表,它的元素就是原文件中的一行。
三、写入文件
对应的方法是write,这里关键要说明一下w模式打开文件时写入与a模式写入文件的区别
将 f2 以w模式打开data2.txt文件,并写入一串内容:
f2 = open("./datas/data2.txt", 'w', encoding='utf-8')
f2.write("Hello World")
f2.close()
起初,data2.txt文件的内容与之前演示的data.txt是一致的,执行上面的代码后,data2.txt的内容被覆盖了:

如果是以a模式打开文件,那么写入的内容就附加到原有内容的后面,这里我就用data.txt演示,由于原文件的一行内容较长为了换行,写入的内容就在前面加了一个换行符:
f = open("data.txt", 'a', encoding='utf-8')
f.write("\nHello World")
f.close()
可以看到,在a模式下,写入文件是在其后追加内容:

四、关闭文件、with操作
在之前的代码演示中,就已经有了关闭文件的操作,任何有关文件的操作到最后都要用close方法关闭文件。
其实并非每次对文件进行操作时都要写成“f = open(...)”,再“f.colse()”,还有一种能自动关闭文件的操作,就是使用with,请看下面的具体演示,将之前的追加内容的操作写在一个with语句块中,这样能自动关闭文件:
with open("data.txt", 'a', encoding='utf-8') as f:
print(f.read())
print(f.readline())
f.write("\nHello World")
在上面的代码演示中,open括号内的内容是不变的,后面的as...就是指定打开文件时的对象名,然后在缩进中写各种操作,这点要注意,这样做就可以自动关闭文件。
2550

被折叠的 条评论
为什么被折叠?



