python入门(七):文件和异常(读取文件,文件路径,写入文件,异常处理,存储数据,代码重构)

9.1.从文件之中读取数据

至此,实际上我们已经掌握了编写组织有序而且易于使用的程序所需要的基本技能
在这里插入图片描述
文本文件可存储地数据量多得难以置信,每当需要分析或者修改存储在文件之中的信息的时候,读取文件都非常有用,对于数据分析应用程序来说犹是如此

9.1.1.读取整个文件

首先创建一个文件,包含几行文本,如下所示:
在这里插入图片描述
使用下面这个程序打开并读取上述文件,将其内容显示到屏幕上
在这里插入图片描述

1. 首先是函数open(),要以任何方式使用文件,哪怕仅仅是打印其内容,都要先打开文件,之后才可以访问,函数open()会接受一个参数,这个参数就是要打开文件的名称,python要在当前执行文件所在的目录之中找到这个文件,由于当前运行的是file_reader.py,因此python会在这个.py文件所在的目录之中查找这个文件,open()函数会返回一个对象,后面我们使用了as,python就把返回的这个对象存储在file_object中
2. 接着说关键词with,在不需要访问文件的时候将文件关闭,注意到在这个程序之中我么你没有使用close()函数,而仅仅使用了open(),当然我们也可以那样做,但是一旦程序出现bug,导致close语句没有执行,没能妥善的关闭文件导致数据丢失或者受损,更重要的是,并非在任何时候都可以确定关闭程序的最佳时机,我们只管打开文件,并在需要的时候使用它,python自然会在合适的时候将其关闭
3 **之后我们使用函数read(),读取这个文件的全部内容,最为一个长字符串存储在变量contents中,这样通过打印contents的值就可以将文本文件的内容全部显示出来 **
在这里插入图片描述

9.1.2.文件路径

如果想上述文件一样,将一个简单的文件名传递给open()函数,python将在当前的执行文件(即.py程序)所在的目录之中查找文件
但是你要知道,python很有可能找不到你要的文件,可以使用相对路径来打开文件夹中的文件
在这里插入图片描述
同时要注意,在windows系统之中是使用反斜杠而并不是斜杠
实际上也可以将文件在计算机中的准确位置告诉python,这样就不关心你要运行的程序在什么地方了,这就是绝对文件路径
在这里插入图片描述
通常使用绝对路径可以读取系统任何地方的文件
就目前而言,最简单的方法应该就是将数据文件存储在程序文件所在的目录,或者将其存储在程序文件所在目录下的一个文件夹中

9.1.3.逐行读取

在读取文件的时候,常常需要检查其中的每一行,我们可能需要在文件中查找特定的信息,或者是要以某种方式来修改文件中的文本,要以每次一行的方式来检查文件,可以对文件使用for循环
在这里插入图片描述
(1)我们将要读取的文件名称存储在变量filename中,这是使用文件的一种常用的做法,这样可以轻松替换文件
(2)也使用了关键词with,让python可以妥善打开和关闭文件
(3)为查看文件的内容,我们通过对文件对象执行循环来遍历文件中的每一行
(4)当我们真的这样做的时候会发现,空白行增多了

在这里插入图片描述
**为何会出现换行符,这在前面咱们已经说过了 **
在这里插入图片描述

9.1.4.创建一个包含文件各行内容的列表

注意:使用关键词with时候,open()返回的文件对象只能在with代码块内使用,如果要在with代码块之外访问这个内容,可在with代码块内将文件的各行存储在一哥列表之中,并在with代码块外使用该列表,就可以处理文件的任何部分,也可以推迟到程序后面再做处理,
在这里插入图片描述
可以看到:我们使用方法readlines()从文件中读取每一行,并将其存储在一个列表之中,接下来,该列表被存储在变量lines之中,在with代码块之外,我们也可以使用这个变量

9.1.5.使用文件的内容

将文件读取到内存中后,就可以以任何方式使用这些数据了
在这里插入图片描述
像前一个实例一样,我们首先打开文件,将其中的所有行存储在一哥列表之中,我们创建一个变量pi_string,用于存储圆周率的值,接下来使用一个循环将各行都加入pi_string,并删除行末的换行符,之后打印这个字符串并显示长度
在这里插入图片描述
之后我们要删除掉多余的空格,使用strip()而不是rstrip()
在这里插入图片描述
同时也要注意:读取文本文件的时候,python将其中的个文本文件都解读为字符串,如果你读取的是数字,并要将其作为数值使用,就必须要使用函数int()将其转换成为整数或者使用函数float()将其转换成为浮点数

9.1.6.创建一个包含一百万位的大型文件

前面我们分析的仅仅是只有三行的文本文件,但这个代码示例可以处理大得多的文件,也是同样的操作流程,只不过最后我们想让其只显示出小数点后50位,我们可以做如下修改
在这里插入图片描述
实际上对于我们像处理的数据量,python没有任何限制,只要系统内存足够,想处理多少都行

9.1.7.圆周率值中包含你的生日吗

在这里插入图片描述

9.2.写入文件

保存数据最简单的方式就是将其写入文件中,通过将输出写入文件,即便关闭输出窗口,这些文件依然存在,我们可以在程序运行结束之后查看这些输出

9.2.1.写入空文件

要将文本写入空文件,在调用open()时需要提供两个实参,告诉python你要写入打开的文件,示例如下所示:
在这里插入图片描述
在这个示例中,调用open()函数提供了两个实参,一个是要打开文件的名称,另一个是打开文件的模式,要以写入模式打开,实际上也可以指定其他模式:r:读取模式;w:写入模式;a:附加模式;r++:读取和写入文件的模式
如果你省略了模式实参,python将以默认只读模式打开文件
如果你要写入的文件不存在,函数open()将会自动创建它
注意:以‘写入’模式打开文件的时候要小心,如果指定的文件已经存在,python将会在返回文件对象前清空该文件
在这里插入图片描述
注意:相比于你计算机中的其他文件,这个文件并没有什么不同,我们可以打开它,在其中输入文本,复制其内容,粘贴等等都是可以的
python只能将字符串写入文本文件,如果要将数值数据存储在文本文件之中,必须要先使用函数str()将其转换成为字符串格式

9.2.2.写入多行

函数write()不会在你写入的文本末尾增加换行符,因此如果你写入多行的时候没有添加换行符,文本就都会在同一行,示例如下所示:
在这里插入图片描述
要想让每一个字符串都独占一行,需要在write()语句中包含换行符
在这里插入图片描述
自然,我们还可以使用空格,制表符,空行等来设置输出的格式

9.2.3.附加到文件

如果要给文件添加内容而不是覆盖原有的内容,可以附加模式打开,我们以附加模式打开文件,python不会再=在返回文件对象前清空文件,而你写入到文件的行都会添加在文件末尾,如果指定的的文件不存在,python将会为你创建一个新的空文件
在这里插入图片描述

9.3.异常

python使用被称为异常的特殊对象来处理程序执行时发生的错误,每当让python发生不知所措的错误时,其都会创建一个异常对象,如果你编写了处理该异常的代码,那么程序将会继续进行,如果你未对异常进行处理,程序将会停止,并会显示一个traceback,其中包含有关异常的报告
异常是使用try-except来进行处理的,try-except代码块会让python执行指定的操作,同时告诉python在发生异常的时候,应该怎么办
使用try-evcept代码块时,即便发生异常,python程序也会继续进行,显示你编写的友好的错误信息,而不是令用户迷惑的traceback

9.3.1.处理ZeroDivisionError异常

在这里插入图片描述

9.3.2.使用try-except代码块

在出现错误的时候,而且你也知道错误是什么,但是python不太清楚,你就可以编写一个try-except代码块来处理这个异常,如下所示:
在这里插入图片描述

9.3.3.使用异常避免崩溃

发生错误的时候,如果程序的工作仍然没有完成,妥善处理错误就显得尤为重要,这种情况经常会出现在要求用户提供输入的程序之中,如果程序能够妥善处理无效输入,就能再提示用户提供有效输入,而不至于使系统崩溃
在这里插入图片描述

9.3.4.else代码块

在这里插入图片描述
我们让python尝试执行try代码块中的除法运算,这个代码块可能会包含有导致错误的代码,成功执行的代码都放在else代码块之中,就像这个示例一样,如果除法运算执行成功,我们就使用else代码块来打印结果
在这里插入图片描述
try-except-else代码块的工作原理如下:python尝试执行try代码块中的代码,只有可能引发异常的代码才放在try语句中,有时候,一些仅在try代码块成功运行时才执行的代码,这些代码应该放在else代码块中,except代码块告诉python,运行try代码块出现指定异常时该怎么办
通过预测可能发生错误的代码,可以编写出健壮的代码

9.3.5.处理FileNotFoundError异常

使用文件的时候,一种常见的错误就是找不到文件,有可能你查找的文件在其他地方,有可能你文件名输入有问题,对于这些情形,都可以使用try-except代码
在这里插入图片描述

9.3.6.分析文本

在这里插入图片描述

9.3.7.使用多个文件

在这里插入图片描述
在这里插入图片描述

9.3.8.失败时一声不吭

在这里插入图片描述

9.3.9.决定报告那些错误

python的错误处理结构让你能够细致地控制与用户分享错误信息的程度,要分享多少信息由你决定
在这里插入图片描述

9.4.存储数据

有用户输入往往就会有数据存储,我们可以使用模块json来存储数据
json模块能够简单的讲python数据结构存储在文件之中,并在程序再次运行时加载该文件之中的数据,也可以使用json在python程序之间分享数据,同时json格式也并非是python所专有的,这是一种轻便格式,易于学习,易于分享

9.4.1.使用json.dump()和json.load()

在这里插入图片描述
我们先导入模块json,再创建一个数字列表,我们指定了要将数字列表存在其中的文件名称,通常使用文件扩展名为.json,来指出文件存储的数据是JSON格式,接下来,我们以写入模式打开这个文件,让json能够将数据写入其中,我们使用函数json.dump()将数字列表存储在文件number.json中
在这里插入图片描述
下面我们再编写一个程序,使用json.load()函数将这个列表读取到内存之中
在这里插入图片描述
这就是一种在程序之间共享数据的简单方式

9.4.2.保存和读取用户生成的数据

对于用户生成的数据,使用json保存大有裨益
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

9.4.3.重构

以后会经常遇到这样的情况,代码能够正确运行,但是还要做进一步的改进–将代码划分成为一系列完成具体工作的函数,这个过程称为重构,重构是让代码更加清晰,更容易理解,更容易扩展
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:要编写出清晰而且易于维护易于扩展的代码,这种划分工作是必不可少的

9.5.小结:

在本章之中,我学习了如何使用文件,如何一次性的读取文件,以及如何以每次一行的方式读取文件的内容;如何写入文件,以及如何将文本附加在文件末尾,什么是异常以及如恶化处理程序中可能引发的异常,以及保存用户的信息,避免每次用户运行的时候都需要重新提供

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值