Python 文件和异常
从文件中读取数据
1.读取整个文件
with open('data.txt') as file_object:
contents=file_object.read()
print(contents)
程序输出:
1.2340
2.3450
3.4560
4.5670
5.6780
函数**open()**接收一个参数:要打开的文件名称。Python会在当前执行的文件所在的目录中查找指定的文件。函数open()返回一个表示文件的对象。Python将这个对象存储在我们将在后面使用的变量中。
关键字with在不再访问文件后将其关闭。你也可以使用open()和close()来打开和关闭文件,但这样做时,如果程序存在bug,导致close()语句未执行,文件将不会关闭。
相比于原始文件,该输出唯一不同的是末尾多了一个空行。这是因为read()到达文件末尾时返回一个空字符串,而将这个空字符显示出来就是一个空行。要删除多出来的空行,可在print语句中使用rstrip()。
要让Python打开不与程序文件位于同一个目录中的文件,需要提供文件路径。在Windows系统中,在文件路径中使用反斜杠(\)而不是斜杠(/)。
2.逐行读取
with open('data.txt') as file_object:
for line in file_object:
print(line)
程序输出:
1.2340
2.3450
3.4560
4.5670
5.6780
要以每一行的方式读取文件,可对文件对象使用for循环。但是输出结果中,发现空白行明显变多了。这是因为在这个文件中,每行的末尾都有一个看不见的换行符,而print语句也会加上一个换行符,因此每行末尾都有两个换行符:一个来自文件,另一个来自print语句。要消除这些多余的空白行,可在print语句中使用rstrip()。
3.使用文件内容
使用关键字with时,open()返回的文件对象只在with代码块内可用。如果要在with代码块外访问文件的内容,可在with代码块内将文件的各行存储在一个列表中,并在with代码块外使用该列表。
with open('data.txt') as file_object:
lines=file_object.readlines()
for line in lines:
print(line.rstrip())
print(len(lines))
print(float(lines[0])+100)
程序输出:
1.2340
2.3450
3.4560
4.5670
5.6780
5
101.234
readlines()从文件中读取一行,并将其存储在一个列表中。
读取文本文件时,Python将其中的所有文本都解读为字符串。如果你读去的是数字,并要将其作为数值使用,就必须使用函数int()将其转换为整数,或使用函数float()将其转换为浮点数。
4.写入文件
open()可以提供两个实参,第一个实参是打开的文件名称,第二个实参,可以指定读取模式(‘r’)、写入模式(‘w’)、附加模式(‘a’)或能够读取和写入文件的模式(‘r+’)。如果省略了模式实参,Python将以默认的只读模式打开文件。
如果要写入的文件不存在,函数open()将自动创建它。然而,以写入(‘w’)文件模式打开文件时,如果指定的文件已经存在,Python将在返回文件对象前清空该文件。
Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str()将其转换为字符串格式。
filename="data.txt"
with open(filename,'w') as file_object:
file_object.write("I love Python.\n")
file_object.write("Python is great.\n")
程序输出:
I love Python.
Python is great.
异常
Python使用被称为异常的特殊对象来管理程序执行期间发生的错误。异常是使用try-except代码块处理的。
print(5/0)
程序输出:
ZeroDivisionError Traceback (most recent call last)
<ipython-input-42-fad870a50e27> in <module>()
----> 1 print(5/0)
ZeroDivisionError: division by zero
在上述traceback中,ZeroDivisionError是一个异常对象。
try:
print(5/0)
print(6/3)
except ZeroDivisionError:
print("You can't divide by zero")
程序输出:
You can't divide by zero
如果发生异常后,不需要提示用户信息,可以在except中使用pass语句。
编写的很好的且经过详尽测试的代码不容易出现内部错误,如语法或逻辑错误,但只要程序依赖于外部因素,如用户输入、存在指定文件、有网络连接、就有可能出现异常。凭借经验可判断该在程序什么地方包含异常处理块,以及出现错误时该向用户提供多少相关的信息。
存储数据
使用模块Json来存储数据,模块Json能够将简单的Python数据结构转储到文件中,并在程序再次运行时加载该文件中的数据。
json.dump()
json.load()
import json
filename='username.json'
try:
with open(filename) as f_obj:
username=json.load(f_obj)
except:
username=input("What is your name?")
with open(filename,'w') as f_obj:
json.dump(username,f_obj)
print("We'll remember you when you call back, "+username+" .")
else:
print("Welcome back, "+username+" !")
程序输出:
What is your name?Jack
We'll remember you when you call back, Jack .