Python程序设计基础第七章 访问文件_第1页
Python程序设计基础第七章 访问文件_第2页
Python程序设计基础第七章 访问文件_第3页
Python程序设计基础第七章 访问文件_第4页
Python程序设计基础第七章 访问文件_第5页
已阅读5页,还剩24页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇报人:WPSPython程序设计基础第七章访问文件目录01文件的使用流程02文件的读写操作03Python生态系统之os库04小试牛刀目录05拓展实践:根据订单数据生成销售报告06本章小结理解文件的作用。掌握文件使用的流程。掌握文本文件的读取与写入方法。了解

os库的使用。前面虽然介绍了很多数据结构来保存数据,但都是在内存中,因此无法实现长期持久的保存数

据。要达到这一目标,就需要使用文件。本章介绍使用文件的基本流程,以及如何读写文本文件。学习目标PART17.1文件的使用流程相信读者已经习惯了程序要有变量,有各种类型的容器来保存数据。简单如整型、浮点型、字

符串,复杂点的如列表、元组和字典等。但所有这些变量容器都是在内存中的,内存的弱点是一旦

意外关机、断电,保存其中的数据就都没有了。因此如果程序想要持久保存数据就需要使用文件。

文件一般位于磁盘上,磁盘是永久性保存数据的媒介,即使断电也不会丢失数据。因此现实世界的

程序都需要有访问磁盘文件的能力。7.1.1使用文件的原因Python

内置的

open()函数可以打开磁盘上的文件,打开方式可以是读取、写入或二者均可。对

于文本文件,open()函数还可以指定使用何种编码方式打开目标文件。按照面向对象的理念,文件打

开后open()函数会返回一个代表该文件的对象,这个文件对象具有很多操作文件的方法,调用文件

对象的这些方法就可以方便地操作文件了。例如,

假设文件对象叫

file_obj,则关闭这个文件的操作

可以通过

file_obj.close()方法来完成。文件使用完毕后一定要记得关闭,这是每次使用完文件必做的收尾工作。因为当文件被

open()

函数打开时,这个文件就被程序独享占用,操作系统会保证其他的程序无法使用这个文件。如果

程序用完文件但不关闭,则程序对文件的独享占用就仍然持续着,导致其他程序无法正常使用该

文件。使用文件的基本流程如下。第一步,使用

open()函数打开文件,得到一个文件对象。第二步,调用文件对象的方法对文件进行读写操作。第三步,关闭文件。7.1.2使用文件的方法内置的open()函数拥有多个参数,但常用的只有几个。下面通过打开一个文本文件的例子演示

open()函数的使用细节。代码

7.1

要求磁盘上和代码文件相同目录下有

file

文件夹,file

文件夹下有“长信宫灯.txt”文件。代码

7.1

使用

open

函数打开文件7.1.3open()函数的使用#file_obj=open("file/长信宫灯.txt","r",encoding="utf-8")#亦可file_obj=open("file\\长信宫灯.txt","r",encoding="utf-8")forline

in

file_obj:print(line)file_obj.close()这段代码打开指定的文本文件并将其中的内容输出,之后关闭文件。代码

7.1

的运行结果如下。长信宫灯一改以往青铜器皿的神秘厚重,整个造型及装饰风格都显得舒展自如、轻巧华丽,是一件既实用、又美观的灯

具珍品。宫女铜像体内中空,其中空的右臂与衣袖形成铜灯灯罩,可以自由开合,燃烧产生的灰尘可以通过宫女的右臂沉积

于宫女体内,不会大量飘散到周围环境中,其环保理念体现了古代中国人民的智慧,长信宫灯被誉为“中华第一灯”。美国前国务卿基辛格来华访问时曾参观过长信宫灯,并感慨道:“2000

多年前中国人就懂得了环保,真了不起。”长信宫灯一直被认为是中国工艺美术品中的巅峰之作和民族工艺的重要代表而广受赞誉。这不仅在于其独一无二、稀有

珍贵,更在于它精美绝伦的制作工艺和巧妙独特的艺术构思。采取分别铸造,然后合成一整体的方法。考古学和冶金史的研

究专家一致公认,此灯设计之精巧,制作工艺水平之高,在汉代宫灯中首屈一指。1993

年被鉴定为国宝级文物。摘自《百度百科》代码中的

open()函数用到了

3个参数,分别如下。(

1)参数

file:待打开的文件名。open()函数的第一个参数是要打开的文件名,如果文件不在当前路径还要有路径名。其中的路径

分隔符在

Windows平台下使用的是“\”,与

Python

的字符串转义符号冲突了。因此如果想要使用

“\”作为路径分隔符,则每个分隔路径的斜杠要写两遍。如果觉得麻烦,也可以使用“/”斜杠作为

路径分隔符,就像代码中被注释掉的那行一样。(2)参数mode:文件的打开模式。打开模式通常有读、写、追加等几种,表7.1

是文件的常见打开模式。其中,写入模式和追加

模式的区别在于,如果打开的文件原来有内容,则写入模式会完全覆盖掉原来的内容,而追加模式

会在原内容的后边追加新的内容。如果没有指定打开模式,则默认为“r”模式也就是读模式。使用“r”模式打开文件时,要求目

标文件一定要事先存在,否则会报错。而使用“w”模式打开文件时,如果文件名指定的文件不存

在,则

open()函数会创建这个文件。7.1.3open()函数的使用(3)参数

encoding:针对文本文件的编码、解码方案。打开文件时常用到的第三个参数就是

encoding。注意,这里只是说

encoding是常用到的第三个

参数,不是说

encoding是

open()函数的第三个参数。实际上

encoding是

open()函数的第四个参数。这意味着为

encoding

参数传值时,一般要明确写出参数名,即像

encoding="utf-8"

这样书写,这和前两个参数不同。文件名和打开模式这两个参数在传值时写不写参数名都没问题,因为它们就是

open()函数的第一、第二个参数,按照位置对应也是没问题的。但

encoding是

open()函数的第四个参数,如果代码

7.1传值时只写"utf-8",实际上是传给了

open()函数的第三个参数。代码

7.1如果去掉

encoding参数的设置就会报错,错误原因是解码方案不对,无法正确解码。

当打开的文本文件遇到编码错误时,就要了解该文件使用的是何种编码,通过

encoding参数设置正

确的解码方案。7.1.3open()函数的使用打开模式说明r以只读方式打开文件,默认模式w以写入模式打开文件a以追加模式打开文件表

7.1文件的常见打开模式PART27.2文件的读写操作open()函数得到的文件对象有

3个常用的读取文件内容的方法,分别是

read()方法、readline()方

法和

readlines()方法。下面以文本文件为例介绍这

3个方法的用法。1.read()方法这个方法可读入指定长度的内容,如果没有指定长度,则默认将文本文件的内容全部读入。该

方法返回的是一个字符串。代码

7.2演示了

read()方法的使用。代码

7.2

文件对象的

read()方法代码

7.2

的运行结果如下,只有原文的前一小部分内容。读者可将

read()方法括号中的

35去掉,

看一下返回的结果。7.2.1读取文本文件file_obj=open("file/长信宫灯.txt","r",encoding="utf-8")text=file_obj.read(35)#读取前

35个字符print(text)file_obj.close()长信宫灯一改以往青铜器皿的神秘厚重,整个造型及装饰风格都显得舒展自如、2.readline()方法顾名思义,readline()方法一次可以读入文本文件的一行,如代码

7.3所示。这段代码要打开的文

本文件内含纳兰性德的一首《浣溪沙》词,整个文本内容从标题、作者到正文被分成了几行书写。

每次调用readline()方法都会读入一行文本,直到文件尾部。代码

7.3

文件对象的

readline()方法代码

7.3

的运行结果如下。这里有一个细节需要说明,代码中的

print()函数通过

end

参数关闭了自带的换行效果。这是因

为文本文件中每一行的结尾都有一个看不见的换行符,如果不对

end

参数进行设置,则每输出一行文本会换两次行。7.2.1读取文本文件file_obj=open("file/浣溪沙.txt","r",encoding="utf-8")text=file_obj.readline()whiletext

!=

"":print(text,end="")text=file_obj.readline()file_obj.close()浣溪沙【清】纳兰性德谁念西风独自凉,萧萧黄叶闭疏窗。沉思往事立残阳。被酒莫惊春睡重,赌书消得泼茶香。当时只道是寻常。3.readlines()方法与

readline()方法不同,readlines()方法将文本文件的内容以列表形式返回,文件的每一行是列表

的一个元素,如代码

7.4所示。代码

7.4

文件对象的

readlines()方法readlines()方法会将文件中的所有行都读取出来,每一行文本作为一个元素保存在列表lines_lst

中,所以代码

7.4

的运行结果如下,注意每行行尾的换行符。7.2.1读取文本文件file_obj=open("file/浣溪沙.txt","r",encoding="utf-8")lines_lst=file_obj.readlines()print(lines_lst)file_obj.close()['浣溪沙\n','【清】纳兰性德\n','谁念西风独自凉,萧萧黄叶闭疏窗。沉思往事立残阳。\n','被酒莫惊春睡重,

赌书消得泼茶香。当时只道是寻常。\n']如果读入文本内容后不是简单地从头到尾输出,而是有其他处理需求,则可以根据需要组合使

用多个读入文本的方法。例如,代码

7.5使用了

readline()和

readlines()两个方法,将词的标题、作者与正文分开处理。代码

7.5

组合使用文件对象的方法7.2.1读取文本文件file_obj.close()forline

in

lines_lst:print(line,end="")author=author[:-1]#去掉行尾的换行符title=title[:-1]msg="——{a}

·《{t}》".format(a=author,t=title)

print(msg)title=file_obj.readline()author=file_obj.readline()lines_lst=file_obj.readlines()file_obj=open("file/浣溪沙.txt","r",encoding="utf-8")#读取词标题

#读取词作者

#读取词正文代码没有按照原始书写顺序输出,而是希望将标题与作者放到正文的后边,并为词的标题添加了书名号,最终的运行结果如下。谁念西风独自凉,萧萧黄叶闭疏窗。沉思往事立残阳。被酒莫惊春睡重,赌书消得泼茶香。当时只道是寻常。——【清】纳兰性德

·《浣溪沙》向文本文件写入内容的操作可以通过文件对象的write()方法来完成,该方法只是将指定的字符

串写入文件,如果需要换行,则换行符也需要调用者提供。代码

7.6

使用

write()方法向文本文件写入

3

个“不要回答!”,因为没有提供换行符,所以虽

然代码分

3行调用了

3次

write()方法,但是写入的

3个“不要回答!”会出现在同一行。如果希望文件中分

3行书写,那么应该改为“不要回答!\n”。代码

7.6使用文件对象的write()方法另外需要注意的是,上述代码使用了“w”模式打开文件,如果使用“r”模式打开文件,那么

是无法写入内容的。但“w”模式意味着每次写入内容时都会覆盖原来的内容,如果想要在原来内容的基础上追加内容,那么就要使用“a”模式打开文件。7.2.2写入文本文件#文本文件如果事先不存在,则

w模式下

open()函数会自动创建该文件myfile=open("file/三体.txt","w")myfile.write("不要回答!")myfile.write("不要回答!")myfile.write("不要回答!")myfile.close()无论是读取内容还是写入内容,每次打开文件时都要记着使用完毕后关闭文件。可要是遗忘了

怎么办呢?为了确保文件用完之后关闭,也省去每次都要调用

close()方法的麻烦,Python提供了with

语句,这个语句可以进行某种情景管理。当使用open()函数打开文件得到文件对象后,把文件对象交给with

语句,with

语句会维护着使用该文件的情景,一旦程序完成了对该文件的使用,要离开

with情景时,with语句负责关闭文件,无须程序员手动书写

close()方法了。在代码

7.7

中,使用

open()函数打开文件后将文件对象交给

with语句,之后对文件的操作代码

都从属于with情景,因此会有缩进。当程序的执行离开with语句时就意味着对该文件的操作结束了,

with语句会自动关闭该文件。代码

7.7

使用

with语句自动关闭文件7.2.3with语句withopen("file/陶行知名言.txt","a",encoding="utf-8")asmyfile:myfile.write("人生天地间,各自有禀赋;为一大事来,做一大事去。\n")withopen("file/陶行知名言.txt","r",encoding="utf-8")asmyfile:text_lst=myfile.readlines()forline

in

text_lst:print(line[:-1])左侧代码中,open()函数返回的文件对象通过

as关键字起名为

myfile,在

with语句块内可以使

用

myfile

指代这个文件,对其进行各种操作。从下面的输出结果可知,该文本文件在追加内容之前,原本有一行陶先生的名言。千教万教,教人求真;千学万学,学做真人。人生天地间,各自有禀赋;为一大事来,做一大事去。PART37.3Python生态系统之os库标准库

os

的名称来自

Operating

System(操作系统)的缩写,它是

Python和操作系统打交道的

一个重要的库。平时交互式操作计算机时,免不了要频繁和文件系统打交道,如创建新的文件夹、

在文件夹路径中移动位置、删除已有的文件夹、给文件夹和文件改名等操作都是十分常见的。这些操作平时可以通过键盘、鼠标交互式完成,但要是在程序代码中需要做这些操作该怎么办呢?这时就该

os库出马了。os库中有一个rename()函数可以为文件或文件夹修改名称,如代码

7.8所示。

代码

7.8使用

rename()函数修改文件名7.3.1修改文件名import

oswithopen("file/test.txt","w")asmyfile:myfile.write("仕而优则学,学而优则仕\n")myfile.write("意思是工作后还有余力的就应该去学习进修,不断提高自己;")myfile.write("学习、研究之余要多参与具体的工作与实践。\n")os.rename("file/test.txt","file/论语摘录.txt")print("改名成功")这段代码要求

file文件夹事先存在,test.txt文件存在与否均可,因为代码以“w”模式打开test.txt

文件,如果

file

文件夹下没有该文件则

open()函数会创建这个文件。之后代码向文件内写入从《论

语

·子张》中摘录的片段及现代文解释。当with语句结束时打开的文件会被关闭,对test.txt文件的占

用将被释放,从而可以使用os库中的rename()函数对其进行重命名,将“test.txt”改名为“论语摘录.txt”。可以使用

os库中的

remove()函数删除文件。例如,代码

7.9

中如果在询问是否删除文件时回答

“Y”,论语摘录.txt文件将会被删除。代码7.9

使用

remove()函数删除文件remove()函数在删除文件时是直接删除的,因此使用该函数时要谨慎,确保不会误操作。7.3.2删除文件import

oswithopen("file/论语摘录.txt","w")asmyfile:myfile.write("日知其所亡,月无忘其所能,可谓好学也已矣。\n")answer=input("要删除该文件吗?

(Y/N)")ifanswer.upper()==

"Y":os.remove("file/论语摘录.txt")print("文件删除成功。")os

库中也有多个完成文件夹操作的函数,如新建文件夹的mkdir()函数、切换当前文件夹的chdir()

函数及显示当前路径下文件清单的

listdir()函数等。代码

7.10演示了这几个函数的使用。代码

7.10os库中文件夹相关的函数使用示例7.3.3文件夹相关操作import

osos.mkdir("./mydir")#新建mydir

文件夹,该文件夹不能已经存在withopen("中国小说.txt","w")as

f:f.write("《芙蓉镇》《平凡的世界》《张居正》《额尔古纳河右岸》《蛙》")withopen("外国小说.txt","w")as

f:f.write("《约翰·克利斯朵夫》《长日将尽》《乱世佳人》《鼠疫》")print(f"文件夹{current_path}下的文件:")forfile_name

inos.listdir():print(file_name)answer=input("os库试验结束,是否删除以上文件夹与文件?

(Y/N)")

ifanswer.upper()==

"Y":forfile_name

inos.listdir():os.remove(file_name)

os.chdir("..")os.rmdir("./mydir")print("删除完毕。")os.chdir("./mydir")current_path=os.getcwd()#删除每一个文件

#向上一层#删除mydir

文件夹#切换当前路径到新建的文件夹

#获取当前路径代码

7.10

的运行结果如下。文件夹

D:\代码示例\mydir下的文件:中国小说.txt外国小说.txtos库试验结束,是否删除以上文件夹与文件?

(Y/N)y删除完毕。这段代码首先使用

mkdir()函数在当前文件夹下新建一个mydir文件夹,“./mydir”

中的点代表

当前文件夹。然后使用

chdir()函数将当前路径切换到新建的

mydir文件夹。而

getcwd()函数则可以获

取当前的路径。接下来使用

open()函数的“w”模式新建两个文件,并各自写入一行文本。代码最后

通过

listdir()函数获取当前路径下即

mydir文件夹下的文件名清单并输出。读者可去磁盘上检验这一

切操作的结果,确认完毕后再来回答是否要删除这些试验中创建的文件。如果回答“Y”,则接下

来的代码会将文件及文件夹都删除。最后,为了便于记忆,表

7.2给出以上各函数名称的含义。7.3.3文件夹相关操作函数名含义mkdir()make

directory(创建目录)chdir()change

directory(修改目录)rmdir()remove

directory

(删除目录)getcwd()get

current

work

directory

(获取当前工作目录)listdir()list

directory

(列表目录)表

7.2os库的常用函数PART47.4小试牛刀在掌握了文件的基本使用流程后,本章的小试牛刀环节演练几个需要访问文本文件的案例,感受有了文件的加持后程序功能的提升。7.4.1

保存比萨定价第

6章的小试牛刀练习了一个计算比萨价格的案例,比萨店提供

2

种尺寸的比萨(12寸、16

寸),

还有

3种调料

greenpeppers、mushrooms、extracheese。它们的定价都直接写在了当时的代码

中,这意味着如果老板想要调整价格就需要修改代码,这显然是不现实的。比较可行的做法是将比萨的基础价格及各种调料的价格保存在一个文本文件中,店

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论