第10章 文件和异常
10.1 从文件中读取数据:
每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其如此。
10.1.1 读取整个文件:
函数open()
- 接受一个参数:要打开的文件的名称
- python在当前执行的文件所在的目录中查找指定的文件
关键字
with
- 在不再需要访问文件后将其关闭
- 你只管打开文件,并在需要时使用它,python自动会在合适的时候将其关闭。
使用
close()
- 如果程序存在bug,导致close()语句未执行,文件将不会关闭。
- 如果过早调用
close()
,会导致更多的错误。
在单个文件测试的时候,我的文件跟我的py放在同一个目录,可以正常读取。当把我py
import
到另一个文件的时候,就要加上相对路径,才能读取。
10.1.2 文件路径:
要让python打开不与程序文件位于同一个目录中的文件,需要提供文件路径,它让python到系统的特定位置去查找。
相对文件路径:
- 让python到指定的位置去找,而该位置是相对于当前运行的程序所在目录的。
- OS X 和linux:
with open('text_files/filename.txt') as file_object:
- windows:
with open('text_files\filename.txt') as file_object:
绝对文件路径:
- 你还可以将文件在计算机中准确位置告诉python,这样就不用关心当前运行的程序存储在什么地方了。
10.1.3 逐行读取:
10.1.4 创建一个包含文件各行内容的列表:
使用关键字with时,open()返回的文件对象只在with代码块内可用。
如果要在with代码块外访问文件的内容,可在with代码块内文件的各行存储在一个列表中,并在with代码块外使用该列表。
10.1.5 使用文件的内容:
读取文本文件时,python将其中的所有文本都解读为字符串。
10.1.6 包含一百万位的大型文件:
对于你可处理的数据量,python没有任何限制。 只要系统的内存足够多,你想处理多少数据都可以。
10.1.7 圆周率值中包含你的生日吗?
查询网页有无挂马,敏感字查询中也可以这样使用,前提是你拥有一个敏感字的字典。
10.2 写入文件
10.2.1 写入空文件:
如果你省略了模式实参,python将以默认的只读模式打开文件。
模式:
- r(读取模式)
- w(写入模式)
- a(附加模式)
- r+(读取和写入模式)
如果你要写入的文件不存在,函数open()将自动创建它。
以写入模式(w)打开文件时,如果指定的文件已经存在,python将在返回文件对象前清空该文件。
python只能将字符串写入文本文件。 要将数值数据存储在文本文件中,必须先使用函数str()将其转换为字符串格式。
10.2.2 写入多行:
要让每个字符串都单独占一行,需要在write()语句中包含换行符:
file_object.write("xxx. \n")
10.2.3 附加到文件:
如果你要给文件添加内容,而不是覆盖原有的内容,可以附加模式打开文件。 你以附加模式(a)打开文件时,python不会在返回文件对象前清空文件,而你写入到文件的行都将添加到文件末尾。 如果指定的文件不存在,python将为你创建一个空文件。
10.3 异常
python使用被称为异常的特殊对象来管理程序执行期间发生的错误。
每当发生让python不知所措的错误时,它都会创建一个异常对象。
如果你编写了处理该异常的代码,程序将继续运行。
如果你未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告。
异常是使用try-except代码块处理的。
- try-except代码块让python执行指定的操作,同时告诉python发生异常时怎么办。
- 使用了try-except代码块,即便出现了异常,程序也将继续运行:显示你编写的友好的错误信息,而不是令用户迷惑的trackback。
之前在不是很了解异常的时候,有时处理异常都是用最暴力的方法
try: xxx except: pass
10.3.1 处理ZeroDivisionError异常:
python无法按你的要求做时,就会创建这种对象。 在这种情况下,python将停止运行程序,并指出引发了哪种异常。
我们可根据这些信息对程序进行修改。
10.3.2 使用try-except代码块:
- 如果try代码块中的代码运行起来没有问题,python将跳过except代码块。
- 如果try代码块中的代码导致了错误,python将查找这样的except代码块,并运行其中的代码即其中指定的错误与引发的错误相同。
10.3.3 使用异常避免崩溃:
发生错误时,如果程序还有工作没有完成,妥善地处理错误就尤其重要。
如果用户怀有恶意,他会通过traceback获悉你不希望他知道的信息。
例如,他将知道你的程序文件的名称,还将看到部分不能正确运行的代码。
有时候,训练有素的攻击者可根据这些信息判断出可对你的代码发起什么样的攻击。
10.3.4 else代码块:
try-except-else代码块的工作原理大致如下:
- python尝试执行try代码块中的代码,只有可能引发异常的代码才需要放在try语句中。
- 有一些仅在代码块成功执行时才需要运行的代码,应放在else代码块中。
- except代码块告诉python,如果它尝试运行try代码块中的代码时引发了指定的异常,该怎么办。
通过预测可能发生错误的代码,可编写健壮的程序,它们即便面临无效数据或缺少资源,也能继续运行,从而能够抵御无意的用户错误和恶意的攻击。
10.3.5 处理FileNotFoundError异常:
python 找出与该错误匹配的except代码块,并运行其中的代码。
10.3.6 分析文本:
无
10.3.7 使用多个文件:
这里try-except的好处:
- 避免让用户看到traceback
- 让程序能够继续分析能够找到的其他文件
10.3.8 失败时一声不吭:
python有一个pass
语句,可在代码块中使用它来让python什么都不要做。
pass
语句还充当了占位符,它提醒你在程序的某个地方什么都没有做,并且以后也许要在这里做些什么。
10.3.9 决定报告哪些错误:
python的错误处理结构让你能够细致地控制与用户分享错误信息的程度,要分享多少信息由你决定。
编写得很好且经过详尽测试的代码不容易出现内部错误,如语法或逻辑错误,但只要程序依赖于外部因素,如用户输入、存在指定的文件、有网络链接,就有可能出现异常。
凭借经验可判断该在程序的什么地方包含异常处理块,以及出现错误时该向用户提供多少相关的信息。
10.4 存储数据
JSON(JavaScript Object Notation)格式最初是为JavaScript开发的,但随后成了一种常见格式,被包括python在内的众多语言采用。
模块json
- 让你能够将简单的python数据结构转储到文件中
- 在python程序之间分享数据
json数据格式并非python专用的,能够让你以json格式存储的数据与使用其他编程语言的人分享。
试过,通过json格式与php前端交互。
10.4.1 使用json.dump()和json.load()
json.dump():
json.load():
这是一种在程序之间共享数据的简单方式。
10.4.2 保存和读取用户生成的数据:
无
10.4.3 重构:
有一种情况:代码能够正确地运行,但可做进一步的改进——将代码划分为一系列完成具体工作的函数。
这样的过程被称为重构
重构让代码更清晰、更易于理解、更容易拓展。
让每个函数都执行单一而清晰的任务
要编写出清晰而易于维护和拓展的代码,这种划分工作必不可少。
10.5 小结
- 如何使用文件
- 如何一次性读取整个文件
- 如何以每次一行的方式读取文件的内容
- 如何写入文件,如何将文本附加到文件末尾
- 什么是异常
- 如何处理程序可能引发的异常
- 如何存储python数据结构,以保存用户提供的信息,避免用户每次运行程序时都需要重新提供