在上一篇《手把手陪您学Python》30——模块中,我们学习了通过导入模块调用其他文件中的函数的方法,这也是我们第一次实现了跨程序或者说跨文件的操作。
接下来,我们将要进一步学习如何通过Python去操作其他文件,包括打开文件、读取文件、关闭文件、写入文件和存储文件等等。Python处理文件非常简单,这也是Python在文本和文件处理领域非常流行的原因。
为了便于今天以及后面几篇内容的讲解和演示,我们要自己先制作一个文本文件,作为贯穿我们后面几篇文章的示例文件。文本文件的内容大家可以随意制作,我这里就用《手把手陪您学Python》这一系列文章的部分标题作为内容,制作了一份文本文件contents.txt,其中已经写入的内容为:
《手把手陪您学Python》1——为什么要学Python?
《手把手陪您学Python》2——Python的安装
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》4——Hello World!
《手把手陪您学Python》5——Jupyter Notebook
《手把手陪您学Python》6——字符串的标识
《手把手陪您学Python》7——字符串的索引
《手把手陪您学Python》8——字符串的切片
《手把手陪您学Python》9——字符串的运算
《手把手陪您学Python》10——字符串的函数
大家可以通过关注“亦说Python”公众号,回复“手31”,下载这份文件以及本篇文章的实例程序。
下面,就开始介绍Python处理文件的基本操作。
1、文件路径
要读取一个文件,首先要知道文件在哪里。
a、相同文件夹
Python会默认现在程序所在的文件夹寻找,如果程序文件和目标文件在一个文件夹,那么是不需要告诉Python目标文件的路径的,只需要直接使用文件名contents.txt,Python就能够读取。
b、下级文件夹
如果目标文件在程序文件所在文件夹的下级(包括下一级或下多级),就可以使用“相对路径”。
比如,程序文件所在的文件夹为python,目标文件在python文件夹里的lesson文件夹里的text文件夹中。此时,目标文件的相对路径就是“lesson/text/contents.txt”。这时,不仅要告诉Python目标文件的文件名称是什么,还要告诉Python目标文件相对于程序文件的位置在哪里。
这里需要注意的是,Windows系统中的文件路径是使用反斜杠“\”来区分不同层级文件夹的,但在Python程序中,是可以使用斜杠“/”来表示的。如果也要使用反斜杠来表示的话,要注意不能直接使用反斜杠“\”,因为在Python中反斜杠是表示转义的。
如果文件路径中有t或者n开头的文件夹(比如C:\python\new\text.txt),与反斜杠组合起来时,\n以及\t会被Python解读为回行或者制表符的。所以当使用反斜杠显示文件地址时,最好对路径中的每一个反斜杠都用反斜杠进行转义,避免出现意外转义的情况(比如C:\\python\\new\\text.txt)。
c、其他文件夹
如果目标文件在程序文件的上级或者其他文件夹中,那么就需要使用“绝对路径”了。绝对路径就是我们文件存储的完整地址和准确位置,和地址栏的地址一样。
这时,就要告诉Python,目标文件的路径为“D:\study\python\contents.txt”。
需要记住的一点是,绝对路径可以代替相对路径使用,但相对路径不能代替绝对路径使用。
2、打开文件
知道了文件位置就可以使用Python的内建函数open()打开文件了。
a、open()
open()中的必须参数是目标文件的文件名(包括路径),其他可选参数含义及完整的语法格式为:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
其中:
file: 必需,文件路径(相对或者绝对路径)
mode: 可选,文件打开模式
buffering: 设置缓冲
encoding: 一般使用utf8
errors: 报错级别
newline: 区分换行符
closefd: 传入的file参数类型
opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符
b、mode参数
在可选参数中,最主要的是文件打开模式mode,默认值为“r”,也就是以只读方式打开的,其他常用模式包括:
模式 | 描述 |
r | 只读模式 (默认)。 |
w | 只写模式,创建新文件(清除路径下的同名文件中的数据)。 |
x | 只写模式,创建新文件,但存在同名路径时会创建失败。 |
a | 添加到已经存在的文件(如果不存在就创建)。 |
r+ | 读写模式。 |
b | 二进制文件的模式,添加到别的模式中(比如“rb”或“wb”)。 |
t | 文件的文本模式(自动将字节解码为Unicode),可以添加到别的模式中(比如“rt”或“xt”)。 |
在本篇文章中,我们会选取其中几种较为常用的模式进行举例,其他未涉及的文件打开模式,大家可以自行编写实例进行测试。
c、encoding参数
另外一个可能会用到的参数是encoding。encoding是编码的意思,就是当我们要打开的文件编码格式,与我们编译器所用编码格式不一致时,需要增加的一个参数项,一般使用“encoding = 'utf-8'”作为关键字参数增加到open()函数中即可。
当我们的目标文件中只有英文字母、数字、字符时,一般是不需要添加这个参数的。如果目标文件中含有中文字符,不但要使用这个参数,而且要注意在我们制作目标文件时,要将编码模式改为UTF-8之后再保存,否则就可能出现无法解码的情况。此时,即使使用“encoding = 'utf-8'”,也会因为目标文件本身不是UTF-8格式的而无法打开。
d、打开文件
学习了如何打开文件的open()函数后,我们就可以写出下面的代码打开我们的目标文件了:
In [1]: path = 'lesson/text/contents.txt' # 相对路径,其他方式请大家自行练习
file_object = open(path, encoding = 'utf-8') # 默认mode = 'r'
由于相对路径和绝对路径一般比较长,所以习惯上会将路径赋值给path或者filename变量,再作为open()的函数。当然也可以直接将路径作为参数,特别是直接使用目标文件的文件名时,就可以直接作为open()的参数了。需要注意的是,无论是使用路径还是文件名,都要写成字符串的形式。
打开文件后我们是否就可以读取了呢?
让我们打印一下刚才打开的文件file_object,看看是不是目标文件的内容:
In [2]: path = 'lesson/text/contents.txt'
file_object = open(path, encoding = 'utf-8')
print(file_object)
Out[2]: <_io.TextIOWrapper name='lesson/text/contents.txt' mode='r' encoding='utf-8'>
可以看到,返回的结果并不是目标文件的内容,而是一个迭代器。也就是说,open()函数将目标文件打开后,只返回了一个可以用来遍历的数据,这点会在我们下一篇介绍的逐行读取文件时有所体会,而目标文件中的内容,还需要靠其他方式才能读取。
下一篇,我们就将重点讲解文件读取的几种方法,敬请关注。
感谢阅读本文!如有任何问题,欢迎留言,一起交流讨论^_^
要阅读《手把手陪您学Python》系列文章的其他篇目,请关注公众号点击菜单选择,或点击下方链接直达。
《手把手陪您学Python》3——PyCharm的安装和配置
《手把手陪您学Python》5——Jupyter Notebook
For Fans:关注“亦说Python”公众号,回复“手31”,即可免费下载本篇文章所用示例语句。
