Python安全攻防:渗透测试实战指南
上QQ阅读APP看书,第一时间看更新

2.6 文件处理

文件就像一个仓库,可以存储各种类型的数据。根据用途可以将文件分为数据库文件、图像文件、音频文件、视频文件、文本文件等。本节主要介绍文本文件的处理。在文本文件中存储的是常规字符串,由文本行组成,每行通常由换行符“\n”结尾。

对于文本文件来说,通常的操作流程为打开文件并创建对象,对该文件内容进行读取、写入、删除、修改等操作,关闭并保存文件。

1.打开文件并创建对象

在Python中内置了文件对象,通过open()函数就可以指定模式打开指定文件,并创建文件对象,该函数的格式如下:


open(file[, mode='r'[, buffering=-1]])

其中各参数的含义如下:

·file:指定要打开或者创建的文件的名称,如果该文件不存在于当前目录中,则需要明确指出绝对路径。

·mode:指定打开文件后的处理方式,其中包括读模式、写模式、追加模式、二进制模式、文本模式、读写模式等。

·buffering:指定读写文件的缓冲模式,数值为0表示不缓存,数值为1表示使用行缓存模式,数值大于1表示缓冲区的大小,默认值为-1。二进制文件和非交互文本文件以固定大小的块为缓冲单位,等价于io。

2.对文件内容进行操作

对文件内容进行的操作包括:文件的读取、写入、追加,以及设置采用二进制模式、文本模式、读写模式等。下面针对读写操作进行详细讲解。

(1)向文本文件中写入内容

如果需要向文本文件中写入内容,在打开文件时就需要指定文件的打开模式为写模式。应根据不同的开发需求选取不同的写入模式:

·w:写入模式。如果文件已经存在,则先清空文件内容;如果文件不存在,则创建文件。

·x:写入模式,创建新文件,如果文件已经存在,则抛出异常。

·a:追加模式,也是写入模式的一种,不覆盖文件的原始内容。

例如,创建demo文件并写入“hello world!”,此时可以选用w模式。


>>> s = 'hello world! \n'
>>> f = open('demo.txt','w')
>>> f.write(s)
>>> f.close()

打开文件,发现在根目录中已经生成文件demo.txt,内容为“hello world!”。

再例如,向已经存在的demo.txt文件中写入“hello China!”且不清空原始内容,此时可以选用a模式打开文件。


>>> s = 'hello China!'
>>> f = open('demo.txt','a')
>>> f.write(s)
>>> f.close()

打开根目录下的demo.txt文件,发现文件内容中增加了“hello China!”字样。

(2)读取文件中的内容

有时需要加载文本中的某行或者全部内容,此时就需要用到文本的读取操作:

·r:读模式(默认模式,可以省略),如果文件不存在,则抛出异常。

·+:读写模式(可与其他模式组合使用)。

例如,读取根目录下demo.txt文件的第一行内容:


>>> f = open('demo.txt','r')
>>> print(f.readline())

运行结果:


hello world!

再例如,读取根目录下demo.txt文件的所有内容:


>>> f = open('demo.txt','r')
>>> print(f.read())

运行结果:


hello world!
hello China!

3.关闭文件对象

当操作完文件内容以后,一定要关闭文件对象,这样才能确保所做的修改都保存到了文件当中,如下所示:


f.close()

文件操作一般都要遵循“打开→读写→关闭”的基本流程,但是如果文件读写操作代码引发了异常,就很难保证文件能够被正常关闭。可以使用上下文管理关键字with来避免产生这个问题。关键字with能够自动管理资源,总能保证文件正确关闭,并且可以在代码执行结束后自动还原开始执行代码块时的现场。下面用一个示例来说明with的使用方法。

例如,利用with关键字向文件demo.txt文件中继续添加“hello ms08067”:


>>> with open('demo.txt','a') as f:
...     f.write('hello ms08067')
...

运行结果:


hello world!
hello china!
hello ms08067