2020/4/261Python语言编程导论第七章文件处理内容提要•概述•文件的常见操作•目录的常见操作2020/4/262一、概述•数据的存储可以使用数据库,也可以使用文件。•数据库保持了数据的完整性和关联性,且使用数据更安全、可靠。使用文件存储数据则非常简单、易用,不必安装数据库管理系统等运行环境。•文件通常用于存储应用软件的参数或临时性数据,是一个命名的比特集合,存储在硬盘、U盘、闪存条等辅助存储设备中。•文件分为两类:文本文件和二进制文件。•Python提供了os、os.path、shutil等模块处理文件。2020/4/263文本文件的特点:•基本是字符串。Python源代码文件和HTML文件等都属于文本文件。•可使用任何文本编辑器进行编辑,对人来说相对容易阅读和修改。•对程序来说,无法直接阅读文本文件。通常,每种文本文件都需要使用相应的分析程序来阅读,例如,Python使用专用分析程序来帮助阅读.py文件,而要阅读HTML文件,需要使用专用于HTML的分析程序。•通常比等价的二进制文件大。需要通过网络发送大型文本文件时,一般要进行压缩(如压缩成zip格式),以提高传输速度和节省磁盘空间。2020/4/264二进制文件的特点:•通常是人无法直接阅读的,且使用常规的文本编辑器无法查看。在文本编辑器中打开二进制文件时,显示的是一堆乱码。有些类型的二进制文件(如JPEG图像)需要使用特殊查看器显示其内容。•占据的空间通常比等价的文本文件小。•对程序来说,可以直接阅读二进制文件。虽然二进制文件各不相同,但通常无需编写复杂的分析程序来读取它们。2020/4/265二、文件的常见操作•文件的常见操作包括:–打开文件–读写文件–复制文件–删除文件2020/4/2661、文件的创建•文件的打开或创建可以使用函数open。该函数可以指定处理模式,设置打开的文件为只读、只写或可读写状态。•格式:•open(file,[mode[,buffering]])—fileobject2020/4/267说明:•参数file是被打开的文件名。若文件file不存在,open()将创建该文件,然后再打开该文件。•参数mode是指文件的打开模式。打开模式如表7-1。•参数buffering设置缓存模式。0表示无缓冲;1表示行缓冲;如果大于1则表示缓冲区的大小,,-1(或者任何负数)代表使用默认的缓冲区大小。以字节为单位。•open()返回1个file对象,file对象可以对文件进行各种操作。2020/4/268表7-1:文件的打开模式参数描述r以只读的方式打开文件r+以读写的方式打开文件w以写入的方式打开文件。先删除文件原有的内容,再重新写入新的内容。如果文件不存在,则创建一个新的文件。w+以读写的方式打开文件。先删除文件原有的内容,再重新写入新的内容。如果文件不存在,则创建一个新的文件。a以写入的方式打开文件,在文件末尾追加新的内容。如果文件不存在,则创建一个新文件a+以读写的方式打开文件,在文件末尾追加新的内容。如果文件不存在,则创建一个新文件b以二进制模式打开文件。可与r、w、a、+结合使用U支持所有的换行符号。如:’\r’、’\n’、’\r\n’2020/4/269关于file类:•file类用于文件管理,可以对文件进行创建、打开、读写、关闭等操作。•文件的处理一般分为三个步骤:–创建并打开文件,使用open()函数返回1个file对象。–调用file对象的read()、write()等方法处理文件。–调用close()关闭文件,释放file对象占用的资源。2020/4/2610表7-2:file类的常用属性和方法属性和方法描述closed判断文件是否关闭,如果文件关闭,返回Trueencoding显示文件的编码类型mode显示文件的打开模式name显示文件的名称newlines文件使用的换行模式file(name[,mode[,buffering]])以mode指定的方式打开文件。如果文件不存在,则先创建文件,再打开文件。Buffering表示缓存模式。0表示不缓存;1表示行缓冲;如果大于1则表示缓冲区的大小;-1或其他负数表示默认缓冲区flush()将缓冲区的内容写入磁盘close关闭文件2020/4/26112020/4/2612属性和方法描述read([size])从文件中读取size个字节的内容,作为字符返回readline([size])从文件中读取1行,作为字符串返回。若指定size,表示每行每次读取的字节数,依然要读完整行的内容readlines([size])将文件中的每行存储在列表中返回。若指定size,表示每次读取的字节数seek(offset[,whence])将文件的指针移动到一个新的位置。Offset表示相对于whence的位置。Whence用于设置相对位置的起点,0表示从文件开头开始计算;1表示从当前位置开始计算;2表示从文件末尾开始计算。若whence省略,offset表示相对文件开头的位置tell()返回文件指针当前的位置next()返回下一行的内容,并将文件的指针移到下一行truncate([size])删除size个字节的内容write(str)将字符串str的内容写入文件writelines(sequence_of_string)将字符串序列写入文件例7-1:文件的创建、写入和关闭2020/4/2613例7-2:在文件尾添加内容2020/4/26142、文件的读取•文件的读取有多种方法,包括:–readline()–readlines()–read()2020/4/2615(1)按行读取方式readline()•readline()每次读取文件中的一行,需要使用永真表达式循环读取文件。但当文件指针移动到文件的末尾时,依然使用readline()读取文件将出现错误。因此程序中需要添加1个判断语句,判断文件指针是否移动到文件的尾部,并且通过该语句中断循环。2020/4/2616例7-3:使用readline()读文件2020/4/2617执行结果:(2)多行读取方式•函数readlines()可一次性读取文件中多行数据。•使用readlines()读取文件,需要通过循环访问readlines()返回的内容。2020/4/2618例7-4:使用readlines()读文件列表2020/4/2619执行结果:(3)一次性读取方式•读取文件最简单的方法是使用read(),read()将从文件中一次性读出所有的内容,并赋值给1个字符串变量。2020/4/2620例7-5:使用read()读文件2020/4/2621执行结果:例7-6:使用read()返回指定字节的内容2020/4/2622执行结果:story.txt内容:3、文件的写入•文件的写入同样有多种方法,可以使用write()、writelines()方法写入文件。•例7-1使用write()方法将字符串写入文件,而writelines()方法可将列表中存储的字符串序列写入文件。2020/4/2623例7-7:使用writelines()写文件2020/4/2624hello.txt内容:将字符串插入到文件开头:•相比在文件末尾添加字符串,将字符串写入文件开头不那么容易,因为操作系统没有提供这样的支持。•解决的方法是:将文件读取到一个字符串中,将新文本插入到该字符串,再将这个字符串写入原来的文件。2020/4/2625例7-8:将字符串插入到文件开头2020/4/2626插入字符串后的story.txt内容:例7-9:•将文件companies.txt的字符串前加上序号1、2、3、…后写到另一个文件scompanies.txt中。2020/4/2627companies.txtscompanies.txt源程序:2020/4/26284、文件的删除•删除文件需要使用os模块和os.path模块。•os模块提供了对系统环境、文件、目录等操作系统级的接口函数。•表7-3列出了os模块常用的文件处理函数。•注意:os模块的open()函数与内置的open()函数的用法不同。2020/4/2629表7-3:os模块常用的文件处理函数函数描述access(path,mode)按照mode指定的权限访问文件chmod(path,mode)改变文件的访问权限open*filename,flag[,mode=0777])按照mode指定的权限打开文件。默认情况下,给所有用户读、写、执行的权限remove(path)删除path指定的文件rename(old,new)重命名文件或目录。old表示原文件或目录,new表示新文件或目录stat(path)返回path指定文件的所有属性fstat(path)返回打开的文件的所有属性lseek(fd,pos,how)设置文件的当前位置,返回当前位置的字节数startfile(filepath[,operation])起动关联程序打开文件。例如:打开的是一个html文件,将启动IE浏览器tmpfile()创建一个临时文件,文件创建在操作系统的临时目录中2020/4/2630表7-4:os.path模块常用函数函数描述函数描述abspath(path)返回path所在的绝对路径isabs(s)测试路径是否绝对路径dirname(p)返回目录的路径isdir(path)判断path指定的是否是目录exists(path)判断文件是否存在isfile(path)判断path指定的是否是文件getatime(filename)返回文件的最后访问时间split(p)对路径进行分隔,并以列表方式返回getctime(filename)返回文件的创建时间splitext(p)从路径中分割文件的扩展名getmtime(filename)返回文件的最后修改时间splitdrive(p)从路径中分割驱动器的名称getsize(filename)返回文件的大小walk(top,func,arg)遍历目录数,与os.walk()功能相同2020/4/2631例7-10:文件的删除2020/4/26325、文件的复制•file类并没有提供直接复制文件的方法,但可以使用read()、write()方法来实现复制文件的功能。2020/4/2633例7-11:用read()、write()实现文件复制2020/4/2634复制文件的其他方法:•shutil模块是另一个文件、目录的管理接口,提供了一些用于复制文件、目录的函数。•其中,copyfile()函数可以实现文件的复制,move()函数可以实现文件的剪切。copyfile(src,dst)move(src,dst)•其中,参数src表示源文件的路径,dst表示目标文件的路径,均为字符串类型。2020/4/2635例7-12:使用shutil模块实现文件的复制和移动2020/4/26366、文件的重命名•os模块的函数rename()可以对文件或目录进行重命名。•在实际应用中,经常需要将某一类文件修改为另一种类型,即修改文件的后缀名。可以通过函数rename()和字符串查找函数来实现。2020/4/2637例7-13:修改文件名2020/4/2638例7-14:修改后缀名2020/4/26397、文件内容的搜索和替换•文件内容的搜索和替换可以使用字符串查找和替换来实现。•例7-15:从hello.txt文件中统计字符串’hello’出现的次数。2020/4/2640程序及执行结果:2020/4/2641执行结果:例7-16:将hello.txt中的字符串’hello’全部替换为’hi’,并将结果存入hello2.txt中2020/4/26428、处理二进制文件•Python中,通常使用pickle模块处理二进制文件。•可以使用pickle.dump将数据结构存储到磁盘,之后再用pickle.load从磁盘获取数据结构。•pickle不能用于读写特殊格式的二进制文件,如GIF文件。对这种格式的文件