当前位置: 首页 > 科技观察

一文看懂文件操作和异常模块

时间:2023-03-11 20:24:06 科技观察

本文转载自微信公众号《DataSTUDIO》,作者云多君。转载本文请联系DataSTUDIO公众号。大家好!我是云朵君,今天给大家带来一篇Python文件操作与异常处理的文章。这两部分往往很容易被初学者在入门时忽略。大家关注的重点是如何编写高级算法、如何绘制炫酷的图形、如何使用机器学习模型等,而往往容易忽略Python文件操作和异常处理。这两个看似不起眼但在python中却起着至关重要的作用。下面一起来看看吧。文件操作我们的程序可以读写文件。默认情况下,文件以读取模式('r')打开,但也可以以写入模式('w')和追加模式('a')打开。您的程序可以从文件中读取信息并将数据写入文件。从文件中读取可以让您处理各种信息;写入文件允许用户在下次运行您的程序时重新开始。您可以将文本写入文件,也可以将Python结构(例如列表)存储在数据文件中。从文件中读取要从文件中读取,程序需要打开文件然后读取文件的内容。您可以一次读取文件的全部内容,也可以逐行读取文件。with语句确保在程序完成访问文件时正确关闭文件。一次读取整个文件filename='siddhartha.txt'withopen(filename)asf_obj:contents=f_obj.read()print(contents)逐行读取从文件中读取的每一行在行尾都有一个换行符,并且打印函数添加了自己的换行符。rstrip()方法消除了打印到终端时会产生的额外空白行。filename='siddhartha.txt'withopen(filename)asf_obj:forlineinf_obj:print(line.rstrip())在列表中存储行filename='siddhartha.txt'withopen(filename)asf_obj:lines=f_obj.readlines()forlineinlines:print(line.rstrip())写入文件将'w'参数传递给open()告诉Python你想写入文件。注意:如果文件已经存在,这将删除文件的内容。传递'a'参数告诉Python你想追加到现有文件的末尾。Writeanemptyfilefilename='programming.txt'withopen(filename,'w')asf:f.write("Iloveprogramming!")Writemultiplelinestoanemptyfilefilename='programming.txt'withopen(filename,'w')asf:f.write("Iloveprogramming!\n")f.write("Ilovecreatingnewgames.\n")附加写入文件filename='programming.txt'withopen(filename,'a')asf:f。write("Ialsoloveworkingwithdata.\n")f.write("Ilovemakingappsaswell.\n")文件路径当Python运行open()函数时,它会在同一目录中查找文件存储正在执行的程序的位置。可以使用相对路径从子文件夹中打开文件。您还可以使用绝对路径打开系统上的任何文件。使用open(f_path)asf_obj:lines=f_obj.readlines()forlineinlines:print(line.rstrip())从子文件夹f_path="text_files/alice.txt"打开文件f_path="/home/ehmatthes/books/alice.txt"withopen(f_path)asf_obj:lines=f_obj.readlines()在Windows上打开文件Windows有时会错误地解释正斜杠。如果是这种情况,请在文件路径中使用反斜杠。f_path=r"C:\Users\ehmatthes\books\alice.txt"withopen(f_path)asf_obj:lines=f_obj.readlines()异常模块异常是帮助程序以适当方式响应错误的特殊对象。例如,如果程序试图打开一个不存在的文件,则可以使用异常来显示信息性错误消息,而不是使程序崩溃。将可能导致错误的代码放在try块中。应运行以响应错误的代码位于except块内。只有在try块成功时才应该运行的代码被放入else块中。prompt="Howmanyticketsdoyouneed?"num_tickets=input(prompt)try:num_tickets=int(num_tickets)exceptValueError:print("Pleasetryagain.")else:print("Yourticketsareprinting.")try-except代码块处理ZeroDivisionErrorexceptiontry:print(5/0)exceptZeroDivisionError:print("Youcan'tdividebyzero!")处理FileNotFoundError异常f_name='siddhartha.txt'try:withopen(f_name)asf_obj:lines=f_obj.readlines()exceptFileNotFoundError:msg="Can'tfindfile{0}.".format(f_name)print(msg)编写代码时,很难知道要处理什么样的异常。尝试编写不带try块的代码并让它生成错误。回溯会告诉你你的程序需要处理什么样的异常。else代码块和try块应该只包含可能导致错误的代码。任何依赖于try块才能成功运行的代码都应该放在else块内。使用elseblockprint("Entertwonumbers.I'lldividethem.")x=input("Firstnumber:")y=input("Secondnumber:")try:result=int(x)/int(y)exceptZeroDivisionError:print("Youcan'tdividebyzero!")else:print(result)防止由于用户输入导致的崩溃如果没有下面示例中的except块,如果用户试图除以零,程序就会崩溃。如所写,它将优雅地处理错误并继续前进。#一个简单的除法计算器。print("Enterwonumbers.I'lldividethem.")print("Enter'q'toquit.")whileTrue:x=input("\nFirstnumber:")ifx=='q':breaky=input("Secondnumber:")ify=='q':breaktry:result=int(x)/int(y)exceptZeroDivisionError:print("Youcan'tdividebyzero!")else:print(result)静默失败有时它是可取的程序在遇到错误时继续运行,而不向用户报告错误。在else块中使用pass语句可以做到这一点。在else块中使用pass语句f_names=['alice.txt','siddhartha.txt','moby_dick.txt','little_women.txt']forf_nameinf_names:#报告找到的每个文件的长度。try:withopen(f_name)asf_obj:lines=f_obj.readlines()exceptFileNotFoundError:#继续看下一个文件。passelse:num_lines=len(lines)msg="{0}has{1}lines.".format(f_name,num_lines)print(msg)避免为空,除了块异常处理代码应该捕获程序中预期发生的特定事件执行异常。空的except块将捕获所有异常,包括键盘中断和程序被强制关闭时可能需要的系统退出。如果您想使用try块,但不确定要捕获哪个异常,则使用exception。它会捕获大多数异常,但仍然允许您故意破坏您的程序。avoidemptyexceptblockstry:#Dosomethingexcept:passuseExceptiontry:#DosomethingexceptException:pass打印异常try:#Dosomethingexceptionase:print(e,type(e))使用json将数据存储到文件并从该文件加载数据下次程序运行时。JSON数据格式不是Python特有的,因此您也可以与使用其他语言的人共享这种数据。在处理存储的数据时,了解如何管理异常非常重要。在处理数据之前,通常需要确保您尝试加载的数据存在。使用json.dump()存储数据#Store一些数字。importjsonnumbers=[2,3,5,7,11,13]filename='numbers.json'withopen(filename,'w')asf_obj:json.dump(numbers,f_obj)使用json.load()来存储数据#加载一些以前存储的数字。importjsonfilename='numbers.json'withopen(filename)asf_obj:numbers=json.load(f_obj)print(numbers)确保存储的数据存在importjsonf_name='numbers.json'try:withopen(f_name)asf_obj:numbers=json.load(f_obj)exceptFileNotFoundError:msg="Can'tfind{0}.".format(f_name)print(msg)else:print(numbers)决定报告哪些错误编写良好、经过适当测试的代码不易出现内部错误,如语法或逻辑错误。但是,只要您的程序依赖于外部因素(例如用户输入或文件的存在),就有可能抛出异常。您如何向用户传达错误取决于您。有时用户需要知道文件是否丢失;有时最好静静地处理错误。一点经验将帮助您了解要报告多少。