博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
headfirst python 03, 04
阅读量:6449 次
发布时间:2019-06-23

本文共 3407 字,大约阅读时间需要 11 分钟。

文件与异常

python中的输入机制是基于行的, open()函数与for 语句结合使用, 可以非常容易的读取文件.(打开->处理->关闭)

#!/usr/bin/env python# -*- coding: utf-8 -*-import osos.getcwd()os.chdir('../abc/chap3')os.getcwd()data = open('abc.txt')print(data.readline(), end='')    #打印了第一行# 全部打印data.seek(0)  # 回到文件启始位置for each_line in data: print(each_line, end='')

如果文件有固定的格式,  

abc : bcd

jqk : dee

我们可以用:

(role, line_spoken) = each_line.split(":")  # role = abc, line_spoken = bcd

处理异常

#!/usr/bin/env python# -*- coding: utf-8 -*-import osos.getcwd()os.chdir('../abc/chap3')os.getcwd()data = open('abc.txt')print(data.readline(), end='')    #打印了第一行# 全部打印data.seek(0)  # 回到文件启始位置for each_line in data:   try:     (role, line_spoken) = each_line.split(':',1)       print(role, end='')     print('said: ', end = '')     print(line_spoken, end = '')   except:     pass data.close() except IOError:   # 制定异常类型. ValueError : 数据不符合期望的格式时会出现. IOError : 数据无法正常访问时会出现.

 

数据保存到文件

man = []

other = []

try:

  data = open('sketch.txt')

  for each_line in data:

    try:

      (role, line_spoken) = each_line.split(':', 1)

      line_spoken = line_spoken.strip()

      if role == 'Man':

        man.append(line_spoken)

      elif role == 'Other Man':

        other.append(line_spoken)

    except ValueError:

      pass

    data.close()

except IOError:

  print('The datafile is missing!')

print(man)

print(other)

以写模式打开文件

out = open("data.out","w")

print("asdf", file=out)

out.close()

以写模式打开文件时, 要特别注意程序失败时, 可能文件没有关闭, 文件可能就变成"脏数据"了, 为了避免这样的问题发生.

在最后加上:

finally:

  man_file.close()

  other_file.close()

如果没有出现任何运行时错误, 会执行finally组中的代码, 同样的, 如果出现 IOError, 会执行except组, 然后再运行finally.

错误的具体类型

 运行时出现一个错误时, python会产生一个特定类型的异常(如IOError, ValueError等), 另外, python会创建一个异常对象, 它作为一个参数传入 except 代码组.

下面来看试图打开一个根本不存在的文件时会发生什么?

try:

  data = open('missing.txt')

  print(data.readline(), end='')

except IOError:

  print('File error')

finally:

  data.close()

错误提示信息:

File error

Traceback(most recent call last):

  File "<pyshell#8>", line 7, in<module>

  data.close()

NameError: name 'data' is not defined

文件不存在时, 数据文件对象并未创建, 这样就不可能在数据对象上调用close()方法, 所以, 最后会得到一个NameError错误.

实际上, 通过以上的方法, 并不能很好的定位到错误, 还需要分析一部, 才能看到错误的本质.

产生一个异常并由except组处理时, python解释器将一个异常对象传入这个except组, 只需做一个很小的修改就可以在代码中使用这个异常(作为一个标识符):

except IOError as_err:  # 给异常对象一个名字

  print('File error: ' + str(err))

这样做以后, 错误提示变成了:

File error: [Error 2] No such file or directory: 'missing.txt'

with

由于处理文件时 try/except/finally模式相当常用, 所以python提供一个语句来抽象出相关的一些细节, 对文件使用with语句时, 可以大大减少需要编写的代码量, 因为有了with语句就不再需要包含一个finally组来处理文件的关闭, 例如:

try:

  with open('its.txt', 'w') as data:  #使用 with 就不再使用 finally 了

    print("It's ...", file=data)

except IOError as err:

  print('File error: ' + str(err))

with 语句利用了一种名为 上下文管理协议(context management protocol) 的python技术.

永久保存数据

import pickle

with open('mydata.pickle', 'wb') as mysavedata:   # 这里的b 是告诉python以二进制模式打开数据文件.

  pickle.dump([1, 2, 'Three'], mysavedata)  # 要保存数据, 使用dump()

with open('mydata.pickle', 'rb') as myrestoredata:

  a_list = pickle.load(myrestoredata)  # 将恢复后的数据赋值给一个标识符.

print(a_list)  # 一旦数据回到程序中, 就可以像任何其他数据对象一样处理了.

综上, 程序修改

import pickle

try:

  with open('man_data.txt', 'wb') as man_file, open('other_data.txt', 'wb') as other_file:

    pickle.dump(man, man_file)

    pickle.dump(other, other_file)

except IOError as err:

  print('File error: ' + str(err))

except pickle.PickleError as perr:

  print('Picking error: ' + str(perr))

 

转载于:https://www.cnblogs.com/moveofgod/p/6388622.html

你可能感兴趣的文章
linux下ping不通的解决方法
查看>>
利用ItextPdf、core-renderer-R8 来生成PDF
查看>>
irc操作小记
查看>>
JAVA 与 PHP 的不同和相同
查看>>
建立Ftp站点
查看>>
NavigationController的使用
查看>>
多线程编程之Windows环境下创建新线程
查看>>
ASP.Net MVC的开发模式
查看>>
groupbox 下的datagridview的列标题字体修改混乱
查看>>
HDU-3092 Least common multiple---数论+分组背包
查看>>
CentOS 7使用systemctl如何补全服务名称
查看>>
Unity3D NGUI 给button按钮添加单间事件
查看>>
C# 使用各种API
查看>>
密码的校验.大小写字母,数字,特殊字符中的至少3种
查看>>
ios 不同sdk4.3 6.0版本号,关于方法的兼容性的通用方法
查看>>
Shell编程学习总结
查看>>
070、如何定制Calico 网络policy(2019-04-15 周一)
查看>>
构建之法阅读笔记02
查看>>
Webstorm常用快捷键备忘
查看>>
js滚动加载到底部
查看>>