带你一起学Python-5-Python文件操作和异常处理

"

1、Python文件操作

文件操作是数据持久化的基础,如果数据不能持久保存,信息技术也就失去了存在的意义。(在上一篇推文中介绍的openpyxl模块操作Excel文件中,其实也涉及到了文件操作,只是这些操作第三方厂家已经帮我们封装在了模块内部,我们直接调用它提供的功能即可)

(1)open函数

要想操作文件,首先我们需要用Python内置的open()函数打开一个文件,创建一个文件对象。(这个文件对象可以认为是文件的句柄,我们通过这个句柄来操作那个文件)

函数的接口如下:

file_object = open(file_name, [access_mode], [bufferring])
  • file_name: 要操作的文件的文件名,必须的参数
  • access_mode: 打开文件的模式:只读、只写、追加等。可选参数,默认参数为只读模式
  • bufferring: 指定寄存区的缓冲大小。可选参数。这个参数我们一般不给,用系统默认的就好。

open()函数返回一个文件对象,(联想前面学习的面向对象的思想)那么这个文件对象就会具有它的属性,常用与文件对象相关联的属性列表如下:

属性描述:

  • file.closed 如果文件已关闭,则返回True,否则返回False
  • file.mode 返回被打开文件的访问模式
  • file.name 返回文件的名称

(2)close函数

文件对象的close()函数刷新缓冲区中还没有写入到文件中的数据,并且关闭该文件,之后便不能再访问文件了。如果要再次访问,则要先用open函数打开文件。

用open()打开一个文件,用完了之后,再调用close()关闭文件是一个好习惯。否则可能会导致一些你意向不到的错误。

下面先来看一个读取文件中所有的内容的示例:

file_name = \"test.txt\"
file = open(file_name, \"r\")
print(\"file.closed: \", file.closed)
print(\"file.mode: \", file.mode)
print(\"file.name: \", file.name)
for line in file:
print(line)
file.close()
print(\"file.closed: \", file.closed)

运行结果如下:

可以看到输出了文件中的内容:人生苦短,我用Python。但是,我们并没有去读取文件中的内容。说明:在用open()函数打开文件的时候,返回的文件对象中已经包含了文件中的内容,以列表形式存在,所有我们在没有显式的读取文件内容的情况下仍然还是读取到了文件的内容。

(3)readlines()函数:该函数读取文件的每一行内容,除了最后一行内容外,前面的每一行内容都连带了一个换行符

text.txt中的内容如下:

张三 家里蹲大学
李四 家里蹲大学
王五 家里蹲大学

读取文件内容的代码如下:

file_name = \"test.txt\"
file_object = open(file_name, \"r\")
lines = file_object.readlines()
for line in lines:
print(line, end=\"\")
file_object.close()

运行结果如下:

(3)with关键字的使用(Python最常用的文件操作方式)

在上面的操作文件的程序中,我们都是自己调用close()函数关闭文件的。但是这样并不安全。因为如果我们过早的调用close()函数关闭文件流了,那么后面再次操作文件就有可能会出错;或者如果我们在调用close()函数关闭文件之前代码执行出错了,那么文件将一直不会被关闭。通过使用with关键字可以将关闭文件的操作交给Python来处理,我们不需要关心这个。

上面的代码的改进方式如下:

file_name = \"test.txt\"
with open(file_name, \"r\") as file_object:
# file_object.closed = False
print(\"file_object.closed: \", file_object.closed)
print(\"file contents: \")
lines = file_object.readlines()
for line in lines:
print(line, end=\"\")
print()
# file_object.closed = True
print(\"file_object.closed: \", file_object.closed)

运行结果如下:


使用了with关键字之后,open()函数返回的文件对象只在with的作用域内可用。从运行结果也可以看出,在with作用域外面,file_object.closed == True,说明出了with作用域后,文件对象确实自动关闭了。

(4)write()函数

write()函数的作用是向文件中写入一个字符串。并且write()在向文件中写入字符串时不会自动在末尾追加换行符。

直接上代码示例:

#coding:utf-8
file_name = \"test.txt\"
# 注意:打开文件的模式为追加模式-a
with open(file_name, \"a\") as file_object:
file_object.write(\"SLAM\n\")
file_object.write(\"DeepLearning\n\")
file_object.write(\"MachineLearning\n\")
with open(file_name, \"r\") as file_object:
lines = file_object.readlines()
for line in lines:
print(line, end = \"\")

运行结果如下:

关于Python文件操作就只介绍这么多了。介绍这些只是起到一个抛砖引玉的作用,对于没有编程经验的人来说更好入门。

2、Python异常处理

所谓的异常就是程序在执行期间出现的错误。在Python中用被称为“异常”的对象来表示这些错误。

每次程序运行的时候发生了一个程序不知道如何处理的错误,那么Python就会抛出一个异常对象;如果你事先考虑到可能会出现这个错误并编写了异常处理模块的话,程序将会转到异常处理模块继续执行;如果你没有编写异常处理模块的话,那么程序将会直接停止,并显示一个traceback,其中有包含相关异常的报告。

说这么多,可能初学者对异常还是理解不了。那么先来看一下下面这个场景:

用户先后输入两个数字,然后在程序中对这两个数做除法。(这里面可能会出现什么异常呢?如果用户输入的除数为0的话怎么办?0是不能作为除数的。)

下面先来看第一版不加异常处理的程序:

while True: 
a = int(input(\"Please input a number:\"))
b = int(input(\"Please input a number:\"))
c= a / b
print(a, \" / \", b, \" = \", c)

上面的程序中的input()的作用接收用户的输入,其中参数为字符串,作为提示信息。

运行结果如下:

当用户的输入为0的时候,程序直接停止并显示了Traceback信息:division by zero.

改进程序 - 增加异常处理:

Python对异常进行处理的语法如下:

try:
# 可能出现异常的语句
pass
except ExceptionClass1:
# 对ExceptionClass1类型的异常进行处理的代码
pass
except ExceptionClass2:
# 对ExceptionClass2类型的异常进行处理的代码
pass
else:
# 如果没有出现异常运行的代码
pass

一段代码中,有可能会出现多个异常,因此可以有多个except模块。

改进程序如下:

while True: 
a = int(input(\"Please input a number:\"))
b = int(input(\"Please input a number:\"))
try:
c = a / b
except ZeroDivisionError:
print(\"0不可以作为除数,请重新输入.\")
else:
print(a, \" / \", b, \" = \", c)

运行结果如下:

现在除数为0时,程序不会再执行停止了,而是按照我们提前写好的处理过程进行处理。

对程序中可能出现的异常进行捕获并处理,是使得程序更加鲁棒的一个方法。

-------------------------------------- 我是分割线 --------------------------------------------

关于Python入门系列的推文就结束了。其实之前有推过一个用Python制作的学生信息管理系统的小项目,本来应该先讲基础,再写项目的。现在反过来了,主要是因为基础一点点学比较枯燥,所以先放上一个有趣的小东西。下面还是给出之前的两篇文章的地址把:

  1. http://toutiao.com/item/6728397059499491848/
  2. http://toutiao.com/item/6729024519727481355/
"
发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();