8、Python基础之「文件操作和异常处理」

目录

一、文件操作方法

二、读取文件

1、读取整个文件

2、逐行读取文件

三、写入文件

1、写入空文件

2、附加写入

四、删除文件

五、异常处理

1、ZeroDivisionError异常

2、FileNotFound异常

3、UnicodeDecodeError异常

4、静默异常

六、存储数据


一、文件操作方法

磨刀不误砍柴工,讲解具体内容之前,我们先介绍一下操作文件的方法:open,该方法是通篇内容的基础。

 要使用文件,无论以什么方式,都需要先打开文件,即调用open()方法;open参数是可变的,我们参照图片来说明一下:

通过IDE的提示,可以看出open可以接受多个参数。这里我们简单介绍几个常用的,有兴趣的话可以自行查阅、深入学习。

file:包含路径的文件名称。可以是相对路径,也可以是绝对路径。

mode:操作文件的模式,其中:

        'r'  :只读模式。如果文件不存在,会报异常。

        'w' :写入模式。如果文件不存在,则创建文件;如果文件已存在,则写入文件;如果文件中已有内容,则清空内容重新写入,这个需要特别注意。

        'a' :附加模式。如果文件不存在则创建;如果已存在则继续写入(在原有内容的末尾处继续往下写)。

        'r+' :读写模式

        关于其他模式暂不做介绍,毕竟我也是初学😄如果不指定mode参数,则默认为只读'r'模式。       

encoding:编码格式。比如UTF-8,GBK......等等。如果方法中没有指定参数,一般会跟随系统或者默认UTF-8。某些特殊场景下不使用编码参数可能会导致异常,这时我们可以根据错误提示酌情指定编码格式。

参数就介绍这么多,我们接着来看关于读取及路径的说明。

二、读取文件

1、读取整个文件

1️⃣同一目录下文本文件的读取

我们首先创建一个.txt文件,输入邓丽君的一首歌的一部分歌词,然后将文件和python文件放在同一目录中。

 然后,通过Python读取文件内容并输出。语法如下:


 

第一个例子中,读取的文件和Python文件在同一个目录中,所以参数中只要放文件名就可以了。下面,我们来看文件在程序所在目录的子目录中的处理方式。

2️⃣子目录中文本文件的读取

创建第2个文本文件,我们将其放在图示中程序目录的子目录下:practice/use_file/lrc_part2.txt

然后使用代码进行读取:

 看以看到,第一个参数中带上了路径名。这就是相对路径。

下面,我们再来介绍一种情况:文本文件在程序目录以外的其他目录中。这时我们可以用绝对路径,也可以使用类似linux中表达相对路径的方式。

3️⃣跨目录读取文本文件

首先,使用绝对路径方式读取文件。同样的,先跨文件夹放置一个文本文件:位于common_files下的lrc_part3.txt

 绝对路径读取:

 相对路径读取:

注意:上边的示例中我们都指定了encoding='UTF-8',这是因为系统默认会使用gbk去解码,而日文文字的编码格式不是gbk,所以打开文件时会报错了,这时尝试指定UTF-8解码就可以解决这个问题,但并不绝对,也就是说可能会有UTF-8也解决不了的问题。关于错误信息,稍后介绍异常时会加以说明。

2、逐行读取文件

逐行读取,其实是将文件完全加载后,通过for循环进行逐行处理。我们看一个简单示例:

发现打印出来之后,原有的文本内容之间出现了空行。这是因为原本每行的末尾都有一个看不见的换行符,在执行print()之后会再加上一个换行符,导致每行输出结束时会执行两次换行。要消除这些空行,可在print()中调用rstrip()方法:

 需要注意的是,使用关键字with时,open()返回的文件对象只在with代码块内可用。如果要在with代码块以外使用文件内容,可在with代码块之内将文件按行存储到列表中,然后在代码块以外使用。这里涉及到readlines()方法:

在循环读取列表内容时,我们顺便给每一行的末尾加了一个英文格式的句点符号。这就是一种简单的使用文件内容的方式。

以上示例,我们使用的都是字符串类型的文本内容。如果读取到的文本内容是数,并且想将其作为数值使用,就必须使用转型函数了,比如int()、float()

三、写入文件

开头介绍操作文件的方法时,在参数部分我们提到了写入文件的两种方式:'w'(写入)和'a'(附加)。下面分别说明一下。

1、写入空文件

写入文件时,需要显示的使用参数'w'。我们来直接创建一个文件并写入一些内容。

看一下当前的目录结构,程序目录里只有lrc-dlj.txt一个文本文件

 然后,我们执行一段写入代码,左边的目录中生成了一个名为write-test.txt的文件。

打开文件确认一下内容 :

操作完成。

需要说明的时,在代码中我们在每一个write()方法的末尾都加上了一个换行符,这有助于文本内容清晰易读。否则,许多内容拼接在一行之中,会造成阅读困难。具体情形下,是否需要换行还要根据场景来决定。 当然,也可以考虑其他特殊符号的使用,比如空格、制表符、空行等。

2、附加写入

现在,我们要向刚才生成的文件里追加写入一些内容。此时需要使用参数'a'。

执行下面一段代码:

然后看一下文件内容:

追加成功。 

四、删除文件

删除文件有多种途径,这里我们只介绍一种最简单的方式:os.remove()。

下图,我们有一个number.json文件,在程序中定义这个文件,然后进行删除操作:

 执行之后,再看目录,文件已经被删除。

 有没有发现,程序窗口中,首行多了一个import语句?是的,想要删除文件得格外导入os模块才可以。这和读写是不一样的。

五、异常处理

在Python中,异常是一种特殊对象,其被用来管理程序执行期间发生的错误。每发生一个让Python不知所措的异常时,它都会创建一个异常对象。如果你的代码对异常进行了适当的处理,则程序将继续运行;否则程序将停止运行并显示traceback,这个在以前的示例介绍中我们已经见过。

异常的基本处理方式是try-except。try让Python执行指定的操作,except捕获异常并告诉程序该怎么做。使用try-except,即使出现异常,程序也会继续执行下去。Python关于异常的处理,和java的try-catch是一样的。

我们先来介绍几种常见异常情况。

1、ZeroDivisionError异常

除数不能为0,这是常识。但在实际编写代码时,可能无法保证分母的值,也就有了产生错误的可能。

先来看看没有异常捕获时的运行情况:

 可以看到错误信息的最后明确提示我们除数为0了。

加上异常处理:

这时,如果except后面还有其他代码,程序会继续运行下去。 

2、FileNotFound异常

进行文件操作时,常见的问题是找不到文件。可能是文件不存在、文件名输入错误,或者路径不正确。

异常处理就不再赘述了。 

3、UnicodeDecodeError异常

前边介绍文件读取的相关内容中,提供的每个截图示例中,参数都包括了encoding='UTF-8'。这是因为python在打开文件时默认采用本机操作系统(Windows)的编码,与文件本身使用的编/解码格式不一致,所以直接打开的话会报错。下图可以看到具体的错误信息:

我们尝试捕获一下读取到的文件的encoding,发现是cp936。cp936是操作系统使用的编码,相当于中文编码标准gb2132,而gb2132其实是gbk的一个子集(gbk除了支持简体中文,还支持繁体中文、日文假名)。也就是说,文本文件本身的编码格式是UTF-8,而open方法默认使用系统编码gbk解读文件,前后不一致,进而产生解码异常。

 改为UTF-8,运行成功。

关于编码格式我知道的也不多,所以查阅了不少资料,这里给大家提供一些参考:

https://www.cnblogs.com/fnng/p/5008884.htmlhttps://blog.csdn.net/iTommy2016/article/details/75145071
 

注意:

在上图异常捕获时,我们扩展了一下格式:try-except-else,把依赖try代码块成功执行的代码放到else里去,表示如果try部分没有发生异常,则执行else部分的代码,否则抛出异常。

那么问题又来了:可不可以把else里的代码和try里的代码放到一起,全部置于try模块中而省略else模块呢?且试试看:

嗯,正常执行起来,效果是一样的。

再把编码参数去掉,试试错误的情形:

结果是一样的。

那么问题来了:else存在的意义是什么呢? 只是区分是否需要捕获异常吗?欢迎各位指点迷津。

其他异常诸如索引越界错误、IO错误、类型错误等就不再一一详细描述了。

4、静默异常

在实际编写代码的过程中,我们可能不想让异常信息暴露给用户,而是希望在发生异常时程序能够保持静默,和正常一样继续运行。想要达成目的,仍然需要使用try代码块,但在except部分可以通过pass来告诉程序什么都不要做。

 至于什么时候需要报告异常,什么时候需要静默异常,需要根据具体的业务场景来决定。

六、存储数据

存储数据的方式多种多样,这里我们只介绍一种简单的方式:使用json来存储数据。

首先,通过json.dump()来存储数据。

要使用json的相关功能,需要先导入json模块。然后指定用来保存数据的json文件(下图示例第5行),如果文件不存在则自动生成。dump()接受2个参数:要存储的数据,以及用于存储数据的文件。运行成功后,看以看到左侧目录中生成了目标文件。

 再打开文件看看内容是否正确:

保存之后,还可以通过代码将文件内容再读取出来,这时会用到json.load()。

OVER 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值