1、 程序运行时变量、序列、对象等中的数据暂程序运行时变量、序列、对象等中的数据暂时存储在内存中,当程序终止时它们就会丢失。时存储在内存中,当程序终止时它们就会丢失。为了能够永久地保存程序相关的数据,就需要将为了能够永久地保存程序相关的数据,就需要将它们存储到磁盘或光盘中的文件里。这些文件可它们存储到磁盘或光盘中的文件里。这些文件可以传送,也可以后续被其他程序使用。文件是计以传送,也可以后续被其他程序使用。文件是计算机中程序、数据的永久存在形式。对文件数据算机中程序、数据的永久存在形式。对文件数据的输入输出操作是信息管理的不可或缺的基本要的输入输出操作是信息管理的不可或缺的基本要求。求。学习重点或
2、难点:学习重点或难点:文件基本概念文件基本概念 文件操作文件操作 文件输入输出文件输入输出 文件输入输出操作是几乎所有语言都具有的功文件输入输出操作是几乎所有语言都具有的功能,学习本章后你将具备信息管理的基本技能了。能,学习本章后你将具备信息管理的基本技能了。7.1 文件基本概念文件基本概念 7.2 文件打开和关闭文件打开和关闭 7.3 文件操作文件操作 7.4 文件夹的操作文件夹的操作 7.5 序列化和反序列化序列化和反序列化 7.6 应用实例应用实例 所谓所谓“文件文件”是指一组相关数据的有序集是指一组相关数据的有序集合。这个数据集有一个名称,叫做文件名。例合。这个数据集有一个名称,叫做文
3、件名。例如源程序文件、可执行文件、数据文件、库文如源程序文件、可执行文件、数据文件、库文件等。件等。文件通常是驻留在外部介质文件通常是驻留在外部介质(如磁盘等如磁盘等)上上的,在使用时才调入内存中来。的,在使用时才调入内存中来。从不同的角度,可对文件作不同的分类。从不同的角度,可对文件作不同的分类。从用户的角度看,文件可分为从用户的角度看,文件可分为普通文件普通文件和和设备设备文件文件两种。两种。通常把显示器定义为标准输出文件,文件名通常把显示器定义为标准输出文件,文件名为为sys.stdout,一般情况下在屏幕上显示有关信,一般情况下在屏幕上显示有关信息就是向标准输出文件输出。如前面经常使用
4、的息就是向标准输出文件输出。如前面经常使用的print函数就是这类输出。函数就是这类输出。键盘通常被指定为标准输入文件,文件名为键盘通常被指定为标准输入文件,文件名为sys.stdin,从键盘上输入就意味着从标准输入文,从键盘上输入就意味着从标准输入文件上输入数据。件上输入数据。input函数就属于这类输入。函数就属于这类输入。标准错误输出也是标准设备文件,文件名为标准错误输出也是标准设备文件,文件名为sys.stderr。从文件编码的方式来看,文件可分为从文件编码的方式来看,文件可分为编码编码(ASCII码码)文件文件和和二进制码文件二进制码文件两种。两种。ASCII文件也称为文本文件,这种
5、文文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。码。二进制文件是按二进制的编码方式来存放文件数据内容二进制文件是按二进制的编码方式来存放文件数据内容的一类文件。的一类文件。二进制文件虽然也可在屏幕上显示,但其内容一般无法二进制文件虽然也可在屏幕上显示,但其内容一般无法读懂。然而,二进制文件占用存储空间少,在进行读、写操读懂。然而,二进制文件占用存储空间少,在进行读、写操作时不用进行编码转换,效率要高。为此,这类文件及其操作时不用进行编码转换,效率要高。为此,这类文件及其操作也很常用。作也很常用。在
6、在2.3节已经介绍如何向标准输入文件(节已经介绍如何向标准输入文件(键盘,键盘,sys.stdin)和输出文件(屏幕,)和输出文件(屏幕,sys.stdout)进行读写。下面来介绍如何读)进行读写。下面来介绍如何读写实际的数据文件。写实际的数据文件。Python提供了必要的函提供了必要的函数或方法进行默认情况下的文件基本操作。数或方法进行默认情况下的文件基本操作。用用file对象可以完成大部分的文件操作。对象可以完成大部分的文件操作。在读写磁盘文件前,必须先用在读写磁盘文件前,必须先用Python内置的内置的open()函数打开一个文件,创建一个函数打开一个文件,创建一个file对象。对象。语
7、法为:语法为:=open(file_name,access_mode=r,buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)一个文件被打开后,有一个一个文件被打开后,有一个file对象,可以得到表对象,可以得到表7-2有关文件的各种信息。有关文件的各种信息。属性属性描述描述file.closed 如果文件已被关闭返回如果文件已被关闭返回True,否则返回,否则返回False。file.mode 返回被打开文件的访问模式。返回被打开文件的访问模式。file.name 返回文件的名称。返回文件的
8、名称。file.softspace如果用如果用print输出后必须跟一个空格符,则返回输出后必须跟一个空格符,则返回False;否则否则返回返回True。PyPython 3.x已不支持已不支持。如下示例:如下示例:fo=open(foo.txt,wb)#打开一个文件打开一个文件print(Name of the file:,fo.name)#Name of the file:foo.txtprint(Closed or not:,fo.closed)#Closed or not:Falseprint(Opening mode:,fo.mode)#Opening mode:wbprint(So
9、ftspace flag:,fo.softspace)#Softspace flag:0#Python 2.7 file对象的对象的close()方法刷新缓冲区里任何还没写入文件的信息,并关闭方法刷新缓冲区里任何还没写入文件的信息,并关闭该文件,这之后便不能再进行写入。该文件,这之后便不能再进行写入。当一个文件对象的引用被重新指定给另一个文件时,当一个文件对象的引用被重新指定给另一个文件时,Python会关闭之前会关闭之前的文件。用的文件。用close()方法关闭文件是一个很好的习惯。方法关闭文件是一个很好的习惯。语法:语法:fileObject.close();例如:例如:fo=open(f
10、oo.txt,wb)#打开一个文件打开一个文件 print(Name of the file:,fo.name)#Name of the file:foo.txt fo.close()#关闭打开的文件关闭打开的文件 当处理一个文件对象时当处理一个文件对象时,使用使用 with 关键字是非常好的方式。在结束后关键字是非常好的方式。在结束后,它会帮你正确的关闭文件。而且写起来也比它会帮你正确的关闭文件。而且写起来也比try-finally语句块要简短:语句块要简短:with open(/tmp/workfile,r)as f:.read_data=f.read()f.closed#true fil
11、e对象提供了一系列方法,能让文件对象提供了一系列方法,能让文件访问更轻松。来看看如何使用访问更轻松。来看看如何使用read()和和write()方法来读取和写入文件。方法来读取和写入文件。1、f.write()write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。字符串可以是二进制数据,而不是仅仅是文字。Write()方法不在字符方法不在字符串的结尾添加换行符串的结尾添加换行符(n)。语法:语法:fileObject.write(string);#被传递的参数被传递的参
12、数string是要写入到文件的内容是要写入到文件的内容例如:例如:fo=open(/tmp/foo.txt,wb)#打开一个文件打开一个文件fo.write(Python is a great language.Yeah its great!n);fo.write(bytes(Python language.,encoding=”utf-8”);fo.close()#关闭打开的文件关闭打开的文件2、f.writelines()writelines()的语法:的语法:f.writelines(seq),把,把seq的内容全部写到文件中的内容全部写到文件中(多行一次多行一次性写入性写入)。这个函数
13、也只是如实地写入,不。这个函数也只是如实地写入,不会在每行后面加上任何东西。会在每行后面加上任何东西。1、f.read()read()方法从一个打开的文件中读取一个字符串。需要重点注意方法从一个打开的文件中读取一个字符串。需要重点注意的是,的是,Python字符串可以是二进制数据,而不是仅仅是编码(字符串可以是二进制数据,而不是仅仅是编码(ASCII码)文字。码)文字。语法:语法:fileObject.read(size);这里,被传递的参数是要从已打开文件中读取的字节计数。该方这里,被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入法从文件的开头开始读入,
14、如果没有传入size,它会尝试尽可能多地,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾。例如:读取上面创建的读取更多的内容,很可能是直到文件的末尾。例如:读取上面创建的文件文件foo.txt中的内容。中的内容。fo=open(/tmp/foo.txt,r+)#打开一个文件打开一个文件str=fo.read(10);print(Read String is:,str)fo.close()#关闭打开的文件关闭打开的文件2、f.readline()f.readline()会从文件中读取单独的一行,换行符为会从文件中读取单独的一行,换行符为 n。f.readline()如果返回一个空字符串
15、如果返回一个空字符串,说明已经已经读取到最后一行。说明已经已经读取到最后一行。语法:语法:fileObject.readline(size);#读一行,如果定义了读一行,如果定义了size,则读,则读取一行中取一行中size长度的部分。长度的部分。f.readline()#This is the first line of the file.n#设是第设是第1行内容行内容 f.readline()#Second line of the filen#设是第设是第2行内容行内容 f.readline()#3、f.readlines()f.readlines()将返回该文件中包含的所有行。将返回该文
16、件中包含的所有行。语法:语法:f.readlines(size)把文件每一行作为一个把文件每一行作为一个list的一个成员,并返回这个的一个成员,并返回这个list。如果提。如果提供供size参数,参数,size是表示读取内容的总长,也就是说可能只读到文件是表示读取内容的总长,也就是说可能只读到文件的一部分。的一部分。f.readlines()This is the first line of the file.n,Second line of the filen 另一种方式是迭代一个文件对象然后读取每行:另一种方式是迭代一个文件对象然后读取每行:for line in f:print(lin
17、e,end=)这个方法很简单这个方法很简单,但是并没有提供一个很好的控制。但是并没有提供一个很好的控制。因为两者的因为两者的处理机制不同处理机制不同,最好不要混用。最好不要混用。tell()方法给出文件内的当前位置;换句话说,下一次的读写会发方法给出文件内的当前位置;换句话说,下一次的读写会发生在文件开头这么多字节之后。生在文件开头这么多字节之后。seek(offset,from)方法改变当)方法改变当前文件的位置。前文件的位置。Offset变量表示要移动的字节数。变量表示要移动的字节数。From变量指定开变量指定开始移动字节的参考位置。始移动字节的参考位置。如果如果from被设为被设为0,这
18、意味着将文件的开头作为移动字节的参考,这意味着将文件的开头作为移动字节的参考位置。如果设为位置。如果设为1,则使用当前的位置作为参考位置。如果它被设为,则使用当前的位置作为参考位置。如果它被设为2,那么该文件的末尾将作为参考位置。,那么该文件的末尾将作为参考位置。如下示例,用到上面创建的文件如下示例,用到上面创建的文件foo.txt。fo=open(/tmp/foo.txt,r+)#打开一个文件打开一个文件str=fo.read(10);print(Read String is:,str)position=fo.tell();#查找当前位置查找当前位置print(Current file po
19、sition:,position)#Current file position:10position=fo.seek(0,0);#把指针再次重新定位到文件开头把指针再次重新定位到文件开头str=fo.read(10);print(Again read String is:,str)fo.close()#关闭打开的文件关闭打开的文件1、copyfile()复制文件方法复制文件方法 Python的的shutil模块提供了执行文件或目录操作的方模块提供了执行文件或目录操作的方法,比如复制文件。法,比如复制文件。要使用这个模块,必须先导入它,然后可以调用相关要使用这个模块,必须先导入它,然后可以调用相
20、关的各种功能。可以用的各种功能。可以用shutil.copyfile()方法复制文件,需方法复制文件,需要提供原文件与复制成的新文件为参数。要提供原文件与复制成的新文件为参数。语法:语法:shutil.copyfile(oldfile,newfile)下例将一个已经存在的文件下例将一个已经存在的文件test1.txt复制为复制为test2.txtimport shutil;shutil.copyfile(test1.txt,test2.txt)#复制文件复制文件test1.txt为为test2.txt2、重命名文件、重命名文件 Python的的os模块提供了帮助执行文件处理操作的方模块提供了帮
21、助执行文件处理操作的方法,比如重命名和删除文件。法,比如重命名和删除文件。rename()方法方法 语法:语法:os.rename(current_file_name,new_file_name)rename()方法需要两个参数,当前的文件名和新文方法需要两个参数,当前的文件名和新文件名。件名。下例将重命名一个已经存在的文件下例将重命名一个已经存在的文件test2.txt。import os;os.rename(test2.txt,test3.txt)#重命名文件重命名文件test2.txt到到test3.txt3、remove()删除方法删除方法 可以用可以用remove()方法删除文件,需
22、要提供要删除的方法删除文件,需要提供要删除的文件名作为参数。文件名作为参数。语法:语法:os.remove(file_name)下例将删除一个已经存在的文件下例将删除一个已经存在的文件test3.txt。import os;os.remove(text3.txt)#删除一个已经存在的文件删除一个已经存在的文件test3.txt 所有文件都包含在各个不同的目录下,不过所有文件都包含在各个不同的目录下,不过Python也能轻松处理(第也能轻松处理(第1章已有介绍)。章已有介绍)。os模模块或块或shutil模块中有许多方法能来创建、更改和删模块中有许多方法能来创建、更改和删除目录。除目录。Pyth
23、on的的pickle模块实现了基本的数据序列化和反序模块实现了基本的数据序列化和反序列化。列化。通过通过pickle模块的序列化操作能够将程序中运行的对象模块的序列化操作能够将程序中运行的对象信息永久保存到文件中。信息永久保存到文件中。通过通过pickle模块的反序列化操作,能够从文件中创建上模块的反序列化操作,能够从文件中创建上一次程序保存的对象。一次程序保存的对象。基本接口:基本接口:pickle.dump(obj,file,protocol)有了有了pickle这个对象这个对象,就能对就能对file以读取的形式打开:以读取的形式打开:x=pickle.load(file)说明说明:从:从
24、file中读取一个字符串,并将它重构为原来的中读取一个字符串,并将它重构为原来的Python对象。对象。file:类文件对象,有:类文件对象,有read()和和readline()接口接口【例【例7-1】使用使用pickle模块将数据对象保存到文件。模块将数据对象保存到文件。import pickledata1=a:1,2.0,3,4+6j,b:(string,uUnicode string),c:Noneselfref_list=1,2,3selfref_list.append(selfref_list)output=open(data.pkl,wb)pickle.dump(data1,ou
25、tput)#Pickle字典使用默认的字典使用默认的0协议协议pickle.dump(selfref_list,output,-1)#Pickle列表使用最高可用协议列表使用最高可用协议output.close()#关闭保存的文件关闭保存的文件【例【例7-2】使用使用pickle模块从文件中重构模块从文件中重构Python对象对象 import pprint,picklepkl_file=open(data.pkl,rb)data1=pickle.load(pkl_file)#反序列化对象到反序列化对象到data1pprint.pprint(data1)#打印输出数据对象打印输出数据对象dat
26、a1data2=pickle.load(pkl_file)#反序列化对象到反序列化对象到data2pprint.pprint(data2)#打印输出数据对象打印输出数据对象data2pkl_file.close()【例例7-3】写一个字符串到文本文件,并从文件读写一个字符串到文本文件,并从文件读取输出。取输出。【例例7-4】利用利用os模块查看文件状态信息。模块查看文件状态信息。【例例7-5】从键盘输入一些字符串,逐个把它们写从键盘输入一些字符串,逐个把它们写入文件,直到输入一个入文件,直到输入一个#为止。为止。【例例7-6】从键盘输入一个字符串,将小写字母全从键盘输入一个字符串,将小写字母全部转换成大写字母,然后输出到一个磁盘文件部转换成大写字母,然后输出到一个磁盘文件test中保存。中保存。【例例7-7】有两个磁盘文件有两个磁盘文件test1.txt和和test2.txt,各存放一行字符串信息,要求把这两个文件,各存放一行字符串信息,要求把这两个文件中中的的信息合并信息合并(按字母顺序排列按字母顺序排列),输出到一个新文件,输出到一个新文件test3.txt中。中。【例例7-8】将文件夹下将文件夹下(包括子目录下包括子目录下)所有图片所有图片名称加上名称加上_fc。