python学习笔记(十四)读取文件
1、文件初见
python的基础语法到这里我们一节了解的差不多了,下面的学习就会偏向于工程。有时候我们需要编写程序来分析处理大量的数据,这就要求我们学会处理文件。
文件本质上就是大量文本信息的集合,处理文件简单的说就是编写代码读取或者修改文本信息。
2、读取文件
如果我们想要处理文件,那么就得先将文件内的文本信息读取到内存中。通常我们可以一次性读取文件的全部信息,也可以逐行读取。下面我们结合例子来学习文件的处理。
首先,创建一个空文件夹作为本次学习的工作区。
然后创建一个文本文件(可以利用Sublime Text,注意文件的后缀一般为“ .txt”,包含三行文本信息,并将其存储到上文创建的文件夹中。文本信息如下:
I like python.
1234567890
0987654321
下面编写代码读取并打印info.txt文件中的文本信息。注意,代码文件也要保存到上文创建的文件夹中。先看代码:
with open('info.txt') as file_object:
contents = file_object.read()
print(contents)
运行结果为:
I like python.
1234567890
0987654321
下面我们逐行解析代码:
首先来看第一行的 open() 函数,该函数接受一个参数,即我们想要打开的文件的完整的文件名(必须包含后缀),它实现的功能就是打开指定文件。这里传入的实参实际上不仅仅是一个文件名,因为open() 函数要求传入的其实是文件路径,这个概念后文再详细说。
第一行还有一个特别的关键字 with ,该关键字帮助我们不需要在访问文件之后将其关闭,实际上这一点也很好理解,既然我们用 open()函数打开了指定文件,再处理完文件信息之后,理应用close()函数再将文件关闭,否则很可能会导致文件的数据丢失或者受损,事实也的确如此。
但是,不恰当地使用close()函数同样会导致我们无法正常的访问文件信息,幸好python为用户提供了关键字with。
with会根据用户的代码格式,自动选取合适的时机关闭文件。
file_object可以视为文件的别名(可以自定义名称,视作变量即可),这帮助用户免去重复输入文件全称的繁琐。
读取文件的另一个要点—— read() 方法,该方法的功能是读取指定文件的全部内容,并返回一个字符串,我们可以将字符串赋给一个自定义变量,这样就可以自由使用文本信息了。
接下来我们来学习逐行读取文件:
filename = 'info.txt'
with open(filename) as fo:
for line in fo:
print(line)
运行结果为:
I like python.
1234567890
0987654321
这里的line本质上也是一个自定义变量(我们可以任意取名),但是我们通常都默认这样取名,因为这个for循环的功能就是将文件中的文本逐行返回给指定变量。值得注意的是输出信息中多了两个空白行,这是因为文件中每行的末尾都有一个隐形的换行符,而print()本身在输出结束后也会自动换行,所以就出现了这些看起来有点多余的空白行,至于如何去除大家可以自己想一想(提示:第二篇变量就讲过)
这里提醒大家注意:使用with关键字时,open()返回的文件对象仅在with代码块可用,如果我们想在程序的任意地方使用文本信息,可以在with代码块内就将文件的各行信息存储在列表中。看例子:
filename = 'info.txt'
with open(filename) as fo:
lines = fo.readlines()
for line in lines:
print(line.rstrip()) # 揭晓去除空白行方式的答案
运行结果为:
I like python.
1234567890
0987654321
这里介绍另一个方法—— readlines() :从文件中读取每一行,并按列表格式返回
本文学习的都是文件对象的常用方法,感兴趣的同学可以自行了解其他的方法。
3、文件路径
上文提到 open() 函数要求传入的参数实际上应该是指定文件的文件路径。这个概念可以分为三个部分:
缺省文件路径:这也是例子使用的方法,当用户直接将简单文件名传入函数 open() 时,python将在当前执行的 .py 文件所在目录查找。
相对文件路径:比方说我们将file_reader.py文件存入day_14文件夹,但是info.txt却在day_14中的text_files文件夹中,那么我们在调用函数 open() 时,可以传入参数 ‘text_files/info.txt’ ,在执行文件所在文件夹的子文件夹中查找目标文件,这就是相对文件路径(但同样需要描述路径,只不过简单一点)。
绝对文件路径:这个方式帮助我们读取系统任何地方的文件,但是必须从源头开始描述文件路径。由于绝对文件路径通常比较长,这里建议先存入变量(比如file_path),再传递给 open() 函数。
这里教大家一个快速获取指定文件绝对文件路径的方法(macOS操作系统):打开终端,执行命令
mdfind -name file_name
比如 mdfind -name info.txt