一文搞懂文件操作与异常模块
共 7954字,需浏览 16分钟
·
2021-05-13 20:30
↑↑↑关注后"星标"简说Python
人人都可以简单入门Python、爬虫、数据分析 简说Python推荐 来源:数据STUDIO
作者:云朵君
大家好,我是老表
今天给大家带来一篇Python文件操作与异常处理,这两个部分往往是初学者入门时容易忽略的部分。大家重点的精力都放在如何写出高大上的算法,如何画出酷炫的图形,如何使用机器学习模型等等,而常常容易忽略Python文件操作与异常处理,这两个看似不起眼却在python中却担着至关重要的角色。下面我们就来一起看看吧。
文件操作
我们的程序可以读取文件,也可以写入文件。默认情况下,文件以读模式('r'
)打开,但也可以以写模式('w'
)和附加模式('a'
)打开。
你的程序可以从文件中读取信息,也可以向文件中写入数据。从文件中读取可以让你处理各种各样的信息;写入文件允许用户在下次运行你的程序时重新开始。您可以将文本写入文件,还可以将Python结构(如列表)存储在数据文件中。
读取文件
要从文件中读取,程序需要打开文件,然后读取文件的内容。您可以一次读取文件的全部内容,也可以逐行读取文件。with
语句确保当程序完成对文件的访问后,文件被正确地关闭。
一次读取整个文件
filename = 'siddhartha.txt'
with open(filename) as f_obj:
contents = f_obj.read()
print(contents)
逐行读取
从文件中读取的每一行在行尾都有一个换行符,而print函数
会添加它自己的换行符。rstrip()方法
消除了打印到终端时会产生的额外空白行。
filename = 'siddhartha.txt'
with open(filename) as f_obj:
for line in f_obj:
print(line.rstrip())
将行存储在列表中
filename = 'siddhartha.txt'
with open(filename) as f_obj:
lines = f_obj.readlines()
for line in lines:
print(line.rstrip())
写入文件
将'w'
参数传递给open()
告诉Python你想写入文件。小心:如果文件已经存在,这将删除文件的内容。
传递'a'
参数告诉Python你想要添加到一个现有文件的末尾。
写入一个空文件
filename = 'programming.txt'
with open(filename, 'w') as f:
f.write("I love programming!")
向空文件写入多行
filename = 'programming.txt'
with open(filename, 'w') as f:
f.write("I love programming!\n")
f.write("I love creating new games.\n")
追加写入文件
filename = 'programming.txt'
with open(filename, 'a') as f:
f.write("I also love working with data.\n")
f.write("I love making apps as well.\n")
文件路径
当Python运行open()函数
时,它会在存储正在执行的程序的同一目录中查找文件。可以使用相对路径从子文件夹中打开文件。也可以使用绝对路径来打开系统中的任何文件。
从子文件夹中打开文件
f_path = "text_files/alice.txt"
with open(f_path) as f_obj:
lines = f_obj.readlines()
for line in lines:
print(line.rstrip())
使用绝对路径打开文件
f_path = "/home/ehmatthes/books/alice.txt"
with open(f_path) as f_obj:
lines = f_obj.readlines()
在 Windows
上打开文件
Windows
有时会错误地解释正斜杠。如果遇到这种情况,请在文件路径中使用反斜杠。
f_path = r"C:\Users\ehmatthes\books\alice.txt"
with open(f_path) as f_obj:
lines = f_obj.readlines()
Except
异常模块
异常是帮助程序以适当方式响应错误的特殊对象。例如,如果程序试图打开一个不存在的文件,可以使用异常来显示一个信息丰富的错误消息,而不是使程序崩溃。
将可能导致错误的代码放置在try
块中。响应错误时应该运行的代码位于except
块中。只有在try
块成功时才应该运行的代码被放入else
块。
prompt = "How many tickets do you need? "
num_tickets = input(prompt)
try:
num_tickets = int(num_tickets)
except ValueError:
print("Please try again.")
else:
print("Your tickets are printing.")
try-except
代码块
处理 ZeroDivisionError
异常
try:
print(5/0)
except ZeroDivisionError:
print("You can't divide by zero!")
处理 FileNotFoundError
异常
f_name = 'siddhartha.txt'
try:
with open(f_name) as f_obj:
lines = f_obj.readlines()
except FileNotFoundError:
msg = "Can't find file {0}.".format(f_name)
print(msg)
在编写代码时,很难知道要处理哪种异常。尝试编写没有try
块的代码,并让它生成一个错误。回溯将告诉您程序需要处理哪种异常。
else
代码块
try
块应该只包含可能导致错误的代码。任何依赖于try
块成功运行的代码都应该放在else
块中。
使用 else
块
print("Enter two numbers. I'll divide them.")
x = input("First number: ")
y = input("Second number: ")
try:
result = int(x) / int(y)
except ZeroDivisionError:
print("You can't divide by zero!")
else:
print(result)
防止用户输入导致的崩溃
如果没有下面示例中的except
块,如果用户试图除零,程序将崩溃。正如所写的,它将优雅地处理错误并继续运行。
# 一个简单的除法计算器。
print("Enter two numbers. I'll divide them.")
print("Enter 'q' to quit.")
while True:
x = input("\nFirst number: ")
if x == 'q':
break
y = input("Second number: ")
if y == 'q':
break
try:
result = int(x) / int(y)
except ZeroDivisionError:
print("You can't divide by zero!")
else:
print(result)
默默地失败
有时希望程序在遇到错误时继续运行,而不向用户报告错误。在else
块中使用pass
语句可以做到这一点。
在 else
块中使用pass
语句
f_names = ['alice.txt', 'siddhartha.txt',
'moby_dick.txt', 'little_women.txt']
for f_name in f_names:
# 报告找到的每个文件的长度。
try:
with open(f_name) as f_obj:
lines = f_obj.readlines()
except FileNotFoundError:
# 继续看下一个文件。
pass
else:
num_lines = len(lines)
msg = "{0} has {1} lines.".format(
f_name, num_lines)
print(msg)
避免空的except
块
异常处理代码应该捕获在程序执行期间预期发生的特定异常。空的except
块将捕获所有异常,包括在强制关闭程序时可能需要的键盘中断和系统退出。
如果你想使用try
块,但又不确定要捕获哪个异常,那么使用exception
。它将捕获大多数异常,但仍然允许您故意中断程序。
避免空的 except
块
try:
# Do something
except:
pass
使用 Exception
try:
# Do something
except Exception:
pass
打印异常
try:
# Do something
except Exception as e:
print(e, type(e))
使用json存储数据
json
模块允许您将简单的Python数据结构转储到一个文件中,并在程序下次运行时从该文件加载数据。JSON数据格式不是特定于Python的,所以你也可以与使用其他语言的人共享这类数据。
在处理存储的数据时,了解如何管理异常非常重要。在处理数据之前,通常希望确保试图加载的数据存在。
使用 json.dump()
存储数据
# 存储一些数字。
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)
确保存储的数据存在
import json
f_name = 'numbers.json'
try:
with open(f_name) as f_obj:
numbers = json.load(f_obj)
except FileNotFoundError:
msg = "Can’t find {0}.".format(f_name)
print(msg)
else:
print(numbers)
决定报告哪些错误
编写良好、经过适当测试的代码不太容易出现内部错误,比如语法或逻辑错误。但是,每当你的程序依赖于诸如用户输入或文件存在之类的外部因素时,就有可能引发异常。
如何将错误传达给用户取决于你自己。有时用户需要知道一个文件是否丢失了;有时最好是静默地处理错误。一点经验会帮助你知道该报告多少。
--END--
扫码即可加老表私人微信
观看朋友圈,获取最新学习资源
学习更多: 整理了我开始分享学习笔记到现在超过250篇优质文章,涵盖数据分析、爬虫、机器学习等方面,别再说不知道该从哪开始,实战哪里找了 “点赞”传统美德不能丢