第5单元

文 件



“老师,我刚才写好的程序,重新运行后,之
前的数据就都没有了。”


“我的也是这样。每次运行程序都需要把数据
重新生成一次。如果能保留前一次的运行结果就
好了。”


“小萌、小帅,你们有没有想过怎么可以把上一次运行
的结果保留下来,等下一次运行时可以直接拿来用?”



小萌、小帅和老师讨论的问题,在Python中可以用文件来处理。

5.1 什么是文件




“小萌、小帅,你们能说出计算机中的文件都有哪
些吗?”


“我知道Word文件、文本文件。”


“我还知道音乐文件MP3,还有图片文件
JPG。”





文件用来存放数据。它可以存放在硬盘上,数据永久保留;可以包含任何
数据内容。用文件来组织和表达数据更灵活,也更方便。文件有两种类型:文
本文件和二进制文件。两种文件的数据组织方式不同。

文本文件是指存放形式为长字符串的文件,它们的编码方式统一,如txt
文件;二进制文件是指存放形式不能看成是字符串,都是由0和1组成的文件,
没有统一的字符编码,不能展示为字符,具体的组织形式与文件的用途有关,
如音乐文件MP3、图片文件JPG等。

【例5-1】 输出二进制文件和文本文件。文件“祖国.txt”的内容为“我
爱我的祖国!”。

txtf=open('祖国.txt','rt') #以文本文件形式读入文件

print('-----输出文本文件-----')

print(txtf.readline())

txtf.close()

binf=open('祖国.txt','rb') #以二进制文件形式读入文件

print('-----输出二进制文件-----')

print(binf.readline())

binf.close()





运行结果为:

-----输出文本文件-----

我爱我的祖国!

-----输出二进制文件-----

b'\xce\xd2\xb0\xae\xce\xd2\xb5\xc4\xd7\xe6\xb9\xfa\xa3\xa1'





可以看到,文本文件经过编码,形成了字符串,而二进制文件由一串0和
1组成,文件中的每个字符对应两个字节(16位二进制,输出时为以x开头的
十六进制数)。

Python中,对文本文件和二进制文件的处理方式是一样的,包括:文件打
开、文件关闭、读文件、写文件等。文件的处理流程也都一样:打开文件——
操作文件——关闭文件。


一


想

想



【问题5-1】

 为什么程序中变量的值不能永久保留,而文件可以呢?



“小萌、小帅,当你们需要编辑一篇文章的时候,你们
会做哪些操作?”


“先找到保存文章的文件,打开文件,就可以
编辑了。”


“编辑完了之后,还要保存,最后关闭打开的
文件。”



5.2 文件的打开和关闭



打开和关闭文件

1.



任何文件,都需要先打开才能进行下一步的操作,操作结束需要关闭文件。
处于打开状态的文件只能由打开它的程序操作,其他程序不能操作,只有当该
程序关闭后,其他程序才能打开并操作。

通过open( )函数和close( )函数,可以打开和关闭文件,改变文件的状态,
如图5-1所示。




图5-1 文件的打开和关闭操作



open( )和close( )都是Python的内置函数,可以直接使用。

使用格式:

<变量名>=open(<文件名>, <打开模式>)

说明:文件名指的是需要打开的文件的名字,打开模式指的是以什么方式
打开文件,即打开后文件可以做些什么操作,如表5-1所示。

表5-1 文件的打开模式

打开模式

说 明

r

默认值,只读模式,如果文件不存在,则返回异常 

w

覆盖写模式,如果文件不存在就创建一个新文件,否则就完全覆盖原来的
内容

x

创建写模式,文件不存在就创建新文件,否则程序报错

a

追加写模式,文件不存在就创建新文件,否则在已有文件末尾追加新内容

b

二进制文件模式,可以与r/w/x/a组合使用

t

默认值,文本文件模式,可以与r/w/x/a组合使用

+

与r/w/x/a组合使用,在原功能基础上同时增加读写功能





【例5-2】 文件操作过程。

f=open('古诗.txt') #打开文件,省略了"打开模式",默认为"只读模式"

for i in f:

 print(i)

f.close() #文件操作完后,关闭文件





运行结果:

人生得意须尽欢,莫使金樽空对月






一

练

练



【问题5-2】

 下列有关Python文件操作的叙述,不正确
333
的是( )。

A. open是Python中打开文件的内置函数

B.文件使用完毕,应使用打开文件对象的close( )方法将其关闭

C. Python能够以文本形式或二进制形式打开文件进行操作

D. Python打开的文件不能既进行读操作,又进行写操作



文件的路径

2.




“老师,‘古诗.txt’这个文件在哪儿?”


“嗯,小帅说的是文件的路径问题。这在使用文件的时
候很重要。”



文件的路径其实就是文件存放的位置。我们都有过找东西的经历,寻找东
西关键要知道东西在哪里,知道位置,找起来就又快又准了。计算机上有很多
的文件,使用时,同样需要知道文件存放的位置。文件的位置有两种表示方式:
相对路径和绝对路径。

1)相对路径

上面的程序中,用open('古诗.txt')打开文件时,使用的就是相对路径。
也即要打开的文件“古诗.txt”和打开它的程序文件“5-2.py”在同一个文件夹中。

2)绝对路径

如果要打开的文件和使用它的文件不在同一个文件夹,需要写出要打开文
件的存放位置,这就是绝对路径。

在资源管理器中,文件、文件夹、绝对路径的分布如图5-2所示。




图5-2 资源管理器中文件、文件夹、绝对路径的分布



5.3 文件的读写操作



文件的读写操作,指的是对文件的输入和输出。在前面的程序中,输入基
本是从键盘或者直接在程序中指定,输出都是输出到屏幕上。文件的读写,都
是从文件获取数据,再输入到文件中保存。

读文件

1.



读文件是从文件中获取程序运行需要的数据。根据获取数据的多少,有如
表5-2所示几种读文件的方法。

表5-2 读文件的方法

方 法

说 明

f.read(size=n)

从文件中读入前n个长度的字符串或字节流,若没有该参
数,则读入全部文件内容

f.readline(size=n)

从文件中读入一行内容,如果有参数,则读入该行前n个
长度的字符串或字节流

f.readlines()

从文件中读入所有行,以每行为元素,形成一个列表





【例5-3】 从《赤壁怀古》中读出内容。

name=input('请输入需要打开的文件:') #输入需要打开的文件名称

f=open(name+'.txt','r') #把用户输入的文件名加上扩展名

print('-----带参数的情况-----')

poem=f.read(3)

print(poem)

f.seek(0) #把文件指针重新定位到文件开头

print('-----不带参数的情况-----')

poem=f.read()

print(poem)

f.close()





运行结果:



请输入需要打开的文件:赤壁怀古

-----带参数的情况-----

大江东

-----不带参数的情况-----

大江东去,浪淘尽,千古风流人物。

故垒西边,人道是,三国周郎赤壁。

乱石穿空,惊涛拍岸,卷起千堆雪。

江山如画,一时多少豪杰。

遥想公瑾当年,小乔初嫁了,雄姿英发。

羽扇纶巾,谈笑间,樯橹灰飞烟灭。

故国神游,多情应笑我,早生华发。

人生如梦,一尊还酹江月。





第一次使用f.read(3)带了参数3,表示读入文件中前3个字符,因此输出“大
江东”,第二次使用f.read( ),不带参数,此时读入了整个文件的内容。

还记得小时妈妈指读(见图5-3)绘本吗?


“妈妈的手指头就像指针,指向文件中的字符。”


“f.seek( )就用来移动指针,移动到需要的位置。”






图5-3 指读



说明:

f.seek(0)——把文件指针移动到文件的开头。

f.seek(1)——文件指针指向当前文件的位置。

f.seek(2)——把文件指针移动到文件末尾。

【例5-4】 读《春晓》并逐行打印。

name=input('请输入要打开的文件:')

f=open(name+'.txt','r')

print('-----全部读入文件并逐行打印-----')

poem=f.readlines()

print(poem)

for i in poem:

 print(i)

f.seek(0)

print('-----直接处理-----')

for i in f:

 print(i)

f.close()





运行结果:

请输入要打开的文件:春晓

-----全部读入文件并逐行打印-----

['春眠不觉晓,处处闻啼鸟。\n', '夜来风雨声,花落知多少。']

春眠不觉晓,处处闻啼鸟。

夜来风雨声,花落知多少。

-----直接处理-----

春眠不觉晓,处处闻啼鸟。

夜来风雨声,花落知多少。





使用f.readlines( )时,把文件内容全部都读入到一个列表中,列表的每个
元素是文件每一行的内容,再通过for循环来遍历列表并输出列表内容。这样
做的缺点是,如果文件太大,内容很多时,全部一起调入会非常占用内存,而
且影响程序的执行速度。程序中的第二种方式就是直接处理,用for循环遍历
文件,一次读入一行并输出。



一

练

练



【问题5-3】

 文件 a.txt 中的一行数据为"Hello,world."。

运行语句 f=open("a.txt","rt") 后,下列叙述正确的是( )。

A. f. readall( )的值为'Hello,world.'

B. f. readlines( )的值为'Hello,world.'

C. f. readable( )的值为 True

D. f. readline ( 1 )的值为'Hello,world.'

写文件

2.



写文件就是把数据写入文件中保存,写入数据可以是程序的运行结果。
Python提供了两种写文件的方法,如表5-3所示。

表5-3 写文件的方法

方 法

说 明

f.write(s)

向文件写入一个字符串

f.writelines(lines)

将一个元素全为字符串的列表写入文件





【例5-5】 将古诗《绝句》写入指定文件中。

name=input('请输入需要操作的文件:')

f=open(name+'.txt','w')

poem=input('需要写入文件的内容是什么?')

f.write(poem) #把需要写入的内容作为字符串写入文件 

f=open(name+'.txt','r') #查看写入后文件内容,以读方式再打开文件

f.seek(0)

for i in f:

 print(i)

f.close()





运行结果:

请输入需要操作的文件:绝句

需要写入文件的内容是什么?两个黄鹂鸣翠柳,一行白鹭上青天。

两个黄鹂鸣翠柳,一行白鹭上青天。