前提:为了让程序能够快速的分析大量的数据,我们需要学习处理文件。错误处理可以避免程序在面对意外情形时崩溃。并且学习异常, 它们是Python创建的特殊对象,用于管理程序运行时出现的错误;你还将学习模块json ,它让你能够保存用户数据,以免在程序停止运行后丢失。
一、从文件中读入数据。
创建一个包含几行文本的文件,(例如 number.txt)下面的程序将打开并读取这个文件,并将其显示在屏幕上:
with open('number.txt') as file_object:
contents = file_object.read()
print(contents)
因为read() 到达文件末尾时返回一个空字符串,而将这个空字符串显示出来时就是一个空行,要删除这行空格,只需要在print的时候使用rstrip():
with open('number.txt') as file_object:
contents = file_object.read()
print(contents.retrip())
这样的输出就与源文件没有区别。
当我们要读取得文件存在路径的时候:
如果只将简单的number.txt放入open中,Python将在当前执行的文件(即.py程序文件)所在的目录中查找文件,如果目标文件不在该目录中,就需要加入文件路径,它让Python到系统的特定位置 去查找。
假设number.txt存在于名称为text_files的文件夹中,我们可以这样子去读取它:
**注:**在Linux和OS X和Windows中,打开的方式是不一样的
with open('text_files/number.txt') as file_object:
#这是在Linux和OS X
with open('text_files\filename.txt') as file_object:
#这是在windows中
最保险的操作将文件在计算机中的准确位置告诉Python,这称为绝对文件路径(注意斜杠的方向)
当我们想创建一个包含文件各行内容的列表时, 使用readlines()方法可以从文件中读取每一行,并将其存储在一个列表中。
二、写入文件
示例:
filename = 'number.txt'
with open(filename, 'w') as file_object:
file_object.write("I love 5201314.")
在这个示例中,调用open() 时提供了两个实参。第一个实参也是要打开的文件的名称;第二个实参(‘w’ )告诉Python,我们要以写入模式打开这个文件。打开文件时,可指定读取模式 (‘r’ )、写入模式(‘w’ )、附加模式 (‘a’ )或让你能够读取和写入文件的模式(‘r+’ )。如果你省略了模式实参,Python将以默认的只读模式打开文件。这样就会在.py文件的目录下创建一个名为number的txt文件,内容为"I love 5201314"
Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str() 将其转换为字符串格式。
如果要存入多行数据,要注意换行符的使用,否则文件会黏在一起。
三、异常
前言:Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让Python不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个traceback,其中包含有关异常的报告。异常是使用try-except 代码块处理的。try-except 代码块让Python执行指定的操作,同时告诉Python发生异常时怎么办。使用了try-except 代码块时,即便出现异常, 程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的traceback。
1.处理ZeroDivisionError 异常
譬如当我们想让程序处理被除数为0的除法,程序会报错,提示如下
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
这时候需要使用try-except 代码块来处理引发的异常。
示例:
try:
print(4/0)
except ZeroDivisionError:
print("You can't divide by zero!")
当我们输入被除数为0的时候,程序不会报错,会在屏幕中显示友好的提示。
延伸一下,便可以做出来一个简单的除法计算器:
print("Give me two numbers, and I'll divide them.")
print("Enter 'q' to quit.")
while True:
first_number = input("\nFirst number: ")
if first_number == 'q':
break
second_number = input("Second number: ")
if second_number == 'q':
break
try:
answer = int(first_number) / int(second_number)
except ZeroDivisionError:
print("You can't divide by zero!")
else:
print(answer)
2.处理FileNotFoundError 异常
FileNotFoundError 异常:这是Python找不到要打开的文件时创建的异常。
FileNotFoundError: [Errno 2] No such file or directory: 'number.txt'
解决方法类似:
filename = 'number.txt'
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = "Sorry, the file " + filename + " does not exist."
print(msg)
在找不到该文件时,程序也不会崩溃,提示友好的信息,当然如果不希望程序提示任何东西,只需要在except:中填入pass。
四、存储数据
前言:很多程序都要求用户输入某种信息,如让用户存储游戏首选项或提供要可视化的数据。不管专注的是什么,程序都把用户提供的信息存储在列表和字典等数据结构中。用户关闭程序时,几乎总是要保存他们提供的信息;一种简单的方式是使用模块json 来存储数据。 模块json让你能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。你还可以使用json 在Python程序之间分享数据。更重要的是,JSON数据 格式并非Python专用的,这让你能够将以JSON格式存储的数据与使用其他编程语言的人分享。这是一种轻便格式,很有用,也易于学习。
1.使用json.dump()和json.load()
编写一个存储一组数字的简短程序:
import json
numbers = [2, 3, 5, 7, 11, 13]
filename = 'numbers.json'
with open(filename, 'w') as f_obj:
json.dump(numbers, f_obj)
下面再编写一个程序,使用json.load() 将这个列表读取到内存中:
import json
filename = 'numbers.json'
with open(filename) as f_obj:
numbers = json.load(f_obj)
print(numbers)