【head First python】之文件与异常处理


上一章我们谈到如何处理嵌套列表中的数据,这一节将讲到如何处理来自文件中的数据及异常处理办法。


python是如何处理文件的?

Demo:

file = open('sketch.txt')#使用open函数打开文件并赋值给file
print(file.readline())#读文件第一行数据
print(file.readline())#读文件第二行数据
file.seek(0)#回到文件第一行
print(file.readline())#再读第一行
file.close()#关闭文件,使python不再调用


这里就拿附件中的文件做操作,下面是针对该文件逻辑特点写的代码

Demo:


import os
a = os.getcwd()
print(a)  #打印出当前工作目录
os.chdir('C:\\Users\\haohu\Desktop')#修改当前工作目录
a = os.getcwd()
print(a)  #再打印出当前工作目录,文件要放在工作目录中!
if os.path.exists('sketch.txt'):#判断文件是否存在
    f = open('sketch.txt')
    for i in f:
        if i.find(':') != -1:#判断是否具备分割条件,这里为是否有:做为条件
            (role,  line) = i.split(':',1)#使用split函数并且将:前后分别赋值,,且只切割1个:
            print(role,end='')#打印:前的内容
            print('|||',end='')#万恶的分割线
            print(line,end='')#打印:后的内容
    f.close()
else:
    print('未发现sketch.txt文件')

从上面例子可以看到除了open还多了很多处理该文件的逻辑条件,如split,find,os.path.exists等,看起来是否很复杂,如果该文件中的数据更多,或许需要添加更多的代码去处理这些特定逻辑,否则就等着debug!!



现在,我们就可以使用try/except的方式来处理这些不确定的逻辑条件!

Demo:

try:
    可能藏有错误逻辑的代码
except:
    自定义的恢复错误代码

看起来是不是很酷?让我们改进一下代码!

Demo:

import os
a = os.getcwd()
print(a)  #打印出当前工作目录
os.chdir('C:\\Users\\haohu\Desktop')#修改当前工作目录
a = os.getcwd()
print(a)  #再打印出当前工作目录,文件要放在工作目录中!
try:
    f = open('sketch.txt')
    for i in f:
        try:
            (role,  line) = i.split(':',1)#使用split函数并且将:前后分别赋值,,且只切割1个:
            print(role,end='')#打印:前的内容
            print('|||',end='')#万恶的分割线
            print(line,end='')#打印:后的内容
        except ValueError: #错误类型为Value
            print('error')
    f.close()
except IOError: #错误类型为IO
    print('未发现sketch.txt文件')

是不是很棒?不仅不需要在代码中添加不是必要的处理逻辑与代码,而且可以看到使用try/except可以自己定义错误类型与错误提示代码,%100的调试利器!


小结:

一:open()函数可以打开一个文件,并创建一个迭代器从文件读取数据,一次读取一个数据行。

二:readline()方法从一个打开的文件读取一行数据。

三:seek()方法可以用来将文件"退回"至起始位置

四:close()方法关闭open()打开的文件

五:split()方法可以将一个字符串根据相应的条件分解为几段

六:ValueError错误类型为数据不符合期望的格式时出现

七:IOError为无法正常访问文件时出现

八:find()方法会在一个字符串中查找一个指定的项,如果查不到则返回-1

九:可以在except:下面写pass,大概等同null或空,也就是当错误发生时忽略,什么也不做!