Python网络爬虫技术与实战
上QQ阅读APP看书,第一时间看更新

1.8.2 文件的基本操作

1.打开文件

Python open()方法用于打开一个文件,并返回文件对象,在对文件进行处理的过程中都需要使用到这个函数,如果该文件无法被打开,则会抛出OSError。

注意,使用open()方法一定要保证使用文件后关闭文件对象,即调用close()方法。

【例1-83】open()函数的常用形式是接收两个参数:文件名(file)和模式(mode)


open(file, mode='r')

完整的语法格式为:


open (file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, 
closefd=True, opener=None)

参数说明:

·file:必需,文件路径(相对或者绝对路径)。

·mode:可选,文件打开模式,详情如表1-11所示。

·buffering:设置缓冲。

·encoding:一般使用utf8。

·errors:报错级别。

·newline:区分换行符。

·closefd:传入的file参数类型。

表1-11 open()的mode模式

2.文件对象

Python中的文件对象file使用open函数来创建,表1-12列出了file对象常用的函数。

表1-12 file对象常用的函数

3.读取文件

我们知道,对文件的读取操作需要将文件中的数据加载到内存中,而上面所用到的read()方法会一次性把文件中的所有内容全部加载到内存中。这明显是不合理的,当遇到一个几G的文件时,必然会耗光机器的内存。这里介绍一下Python中读取文件的四种方法,如表1-13所示。

表1-13 Python中读取文件的相关方法

我们来读取这样一个文本文件:song.txt,该文件的字符编码为utf-8,内容如下。


匆匆那年我们 究竟说了几遍 再见之后再拖延
可惜谁有没有 爱过不是一场 七情上面的雄辩
匆匆那年我们 一时匆忙撂下 难以承受的诺言
只有等别人兑现

下面的例子,都是基于上面的song.txt文件。

【例1-84】读取指定长度的内容

Python3:


with open('song.txt', 'r', encoding='utf-8') as f:
    print(f.read(12))

输出结果:


匆匆那年我们 究竟说

说明 Python3中read(size)方法的size参数指定的是要读取的字符数,这与文件的字符编码无关,就是返回12个字符。

【例1-85】读取文件中的一行内容

Python2:


with open('song.txt', 'r', encoding='utf-8') as f:
    print(f.readline())

Python3:


with open('song.txt', 'r') as f:
    print(f.readline().decode('utf-8'))

输出结果均为:


匆匆那年我们 究竟说了几遍 再见之后再拖延

【例1-86】遍历打印一个文件中的每一行

这里我们只以Python3来进行实例操作,Python2仅是需要在读取到内容后进行手动解码而已,上面已经有示例。

方式一:先一次性读取所有行到内存,然后再遍历打印。


with open('song.txt', 'r', encoding='utf-8') as f:
    for line in f.readlines():
        print(line)

输出结果:


匆匆那年我们 究竟说了几遍 再见之后再拖延

可惜谁有没有 爱过不是一场 七情上面的雄辩

匆匆那年我们 一时匆忙撂下 难以承受的诺言

只有等别人兑现

这种方式的缺点与read()方法是一样的,都会消耗大量的内存空间。

方式二:通过迭代器一行一行地读取并打印。


with open('song.txt', 'r', encoding='utf-8', newline='') as f:
    for line in f:
        print(line)

输出结果:


匆匆那年我们 究竟说了几遍 再见之后再拖延

可惜谁有没有 爱过不是一场 七情上面的雄辩

匆匆那年我们 一时匆忙撂下 难以承受的诺言

只有等别人兑现

另外,我们发现上面的输出结果中行与行之间多了一个空行,这是因为文件每一行的末尾都有换行符,而print()方法也会输出换行。去掉空行比较简单:可以用line.rstrip()去除字符串右边的换行符,也可以通过print(line,end=")避免print方法造成的换行。

文件对象file类的其他方法如表1-14所示。

表1-14 file类的其他方法