Python中的文件和异常
文件是磁盘上确定的存储相关数据的位置。在分析大量的数据时,使用文件可以使你的程序变得更快。异常是任何编程语言用来管理程序运行时发生的错误的特殊对象。
在本教程中,我们将学习 Python 中的文件操作。这些操作包括对文件的读、写、和追加。我们还将学习如何处理ZeroDivisionError 和FileNotFoundError 异常。
先决条件
具备一些Python编码语言的基本知识。
从文件中读取
当处理来自文本文件的数据时,你必须首先将其读入内存。要读一个文件,你必须有一个存在的文件。
让我们用一个编辑器创建一个包含从2020 到2022 的年份列表的文本文件,并把它保存在存放我们的 Python 文件的同一个文件夹中,作为years.txt 。
years.txt 文件应该有以下文字。
2022
2021
2020
下面是一个打开上述文件的程序,读取该文件并打印该文件中的数据。
with open('years.txt') as file_object:
contents = file_object.read()
print(contents)
要打开的文件的名称作为唯一的参数传给open() 函数。Python 在文件夹中寻找years.txt 文件,我们的 Python 文件就存放在这里。
open() 函数返回一个代表该文件的对象 (year.txt),然后存储在变量 file_object 中。
当不再需要访问该文件时,关键字with 关闭该文件。
read() 方法用于读取文件中的全部数据,并将其存储在内容中。
运行上述代码后,我们得到以下结果。
2022
2021
2020
处理文件的内容
现在,你已经学会了如何将一个文件读入内存,让我们试着对这些数据做一些事情。
让我们创建一个单行,容纳years.txt 文件中的所有数字,其中没有空白,如下图所示。
with open('years.txt') as file_object:
lines = file_object.readlines()
yrs_string = '' # create a variable yrs_string to hold the digits of years
for line in lines: # create a loop that adds each line of digits to yrs_string
yrs_string += line.rstrip() #.rstrip() removes the newline character from each line
print(yrs_string) # print this string
print(len(yrs_string)) # print how long the string is
# OUTPUT
# 209020702089
# 12
注意:Python 将文本文件中的所有文本视为一个字符串。如果你从文件中读到一个数字,并且想进行算术运算,请使用
float()函数将其转换成浮点数,或者使用int()函数将其转换成整数。
写入文件
保存数据的最简单的方法之一,是写到文件中。即使在我们关闭了有我们程序输出的终端后,输出仍然会存在。
当向文件写入文本时,我们使用带有两个参数的open() 函数 - 第一个参数是文件名,而第二个参数是你想打开文件的模式。
有四种模式,你可以在其中打开一个文件。
- 读取模式 ('r')
- 写模式 ('w')
- 追加模式('a')
- 读和写('r+')
写入一个空文件
如果你要写的文件根本不存在,open() 函数会自动生成该文件。
比如说。
with open('student.txt', 'w') as file_object:
file_object.write("My name is Felix.")
上面的代码没有在终端打印输出,但当你打开student.txt 文件时,你会看到一行。
My name is Felix.
注意:当以'w'模式打开一个文件并且该文件存在时,Python 将在返回文件对象之前删除该文件。
追加到一个文件中
要向一个文件中添加数据,在追加模式下打开它。你写的任何数据都将被放在文件的末尾。
让我们在student.txt 文件中添加一些行。
with open('student.txt', 'a') as file_object: #’a’ argument to open the file for appending
file_object.write("I am 6 years old\n")
file_object.write("I love playing games\n")
新的student.txt 文件看起来像这样。
My name is Felix.
I am 6 years old
I love playing games
异常
异常是独特的对象,Python 用来控制程序运行时发生的错误。当语法正确的Python程序产生错误时就会出现异常错误。
每当这些错误发生时,Python 都会创建一个异常对象。当我们编写处理异常的代码时,我们的程序将继续运行,即使有错误被抛出。如果我们不这样做,我们的程序就会停止执行,并显示一个回溯,这对用户来说是很难理解的。
Python 使用try-except-finally块来控制异常。一个 try-except 块会通知 Python 在出现异常时如何行动。即使出了问题,我们的程序也会继续执行。
处理 ZeroDivisionError 异常
让我们运行一个程序,用一个数字除以零。我们知道这是不现实的,但让我们看看Python做了什么。
print(6/0)
当我们运行上面的代码时,Python给出了下面的回溯。
Traceback (most recent call last):
File “C:\Users\ADMIN\PycharmProject\pythonProject\main.py”, line 1, in <module>
print(6/0)
ZeroDivisionError: division by zero
由于Python不能除以0,它在回溯中报告一个错误,即ZeroDivisionError,这是一个异常对象。这种对象对 Python 不能做我们要求的事情的情况做出反应。
如果你认为可能发生错误,使用try-except块来控制可能引发的异常。
要处理ZeroDivisionError 异常,使用像这样的 try-except 块。
try:
print(6/0)
except ZeroDivisionError:
print("You can’t divide by zero!") # You can’t divide by zero!
处理FileNotFoundError异常
在处理丢失的文件时,总是会出现错误。如果你写错了文件名的拼写,或者文件不存在,Python 可能无法检索到一个文件。
我们通过应用 try-except 块来处理这种情况。
例如,下面的程序试图读取一个在我的计算机上不存在的文件。
filename 'John.txt'
with open(filename) as f_obj:
contents = f_obj.read()
由于Python不能读取一个不存在的文件,它引发了一个异常。
Traceback (most recent call last):
File “C:\Users\ADMIN\PycharmProject\pythonProject\main.py”, line 2, in <module>
with open(filename) as f_obj:
FileNotFoundError: [Errno 2] No such file or directory: ‘john.txt’
由于Python找不到这个文件,我们在打开它时产生了一个异常,这个异常就是FileNotFoundError异常。
在这个例子中,**open()函数产生了这个错误。要解决这个错误,请在这一行之前使用 try 块,这涉及到open()**函数。
filename = 'John.txt'
try:
with open(filename) as f_obj:
contents = f_obj.read()
except FileNotFoundError:
msg = "Sorry, the file "+ filename + "does not exist."
print(msg) # Sorry, the file John.txt does not exist.
结论
在这篇文章中,我们已经学会了如何。
- 从文件中读取
- 处理一个文件的内容
- 写入文件
- 处理 "零点分割 "异常
- 处理FileNotFoundError异常