文件与异常

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

#!/usr/bin/env python
# -*- coding: utf-8 -*- import os os.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 os os.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))

headfirst python 03, 04的更多相关文章

  1. Python学习--04条件控制与循环结构

    Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...

  2. The Python Challenge 0-4

    The Python Challenge 0-4 项目地址:http://www.pythonchallenge.com/ Level-0 提示Hint: try to change the URL ...

  3. python进阶04 装饰器、描述器、常用内置装饰器

    python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...

  4. Python模块04/包/logging日志

    Python模块04/包/logging日志 目录 Python模块04/包/logging日志 内容大纲 1.包 2.logging日志 3.今日总结 内容大纲 1.包 2.logging日志 1. ...

  5. Python函数04/生成器/推导式/内置函数

    Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...

  6. Python面向对象04 /封装、多态、鸭子类型、类的约束、super

    Python面向对象04 /封装.多态.鸭子类型.类的约束.super 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 3. 鸭子类型 4. 类的 ...

  7. python爬虫04 | 长江后浪推前浪,Reuqests库把urllib库拍在沙滩上

    最近 有些朋友 看完小帅b的文章之后 把小帅b的表情包都偷了 还在我的微信 疯狂发表情包嘚瑟 我就呵呵了 只能说一句 盘他 还有一些朋友 看完文章不点好看 还来催更 小帅b也只能说一句 继续盘他   ...

  8. python 03

    数据结构 在 python 中有4种内建数据结构, 列表, 元组, 字典和集合. 列表 list 有序项目的数据结构, 类似数组, 是对象. 列表用中括号中用逗号分隔的项目定义.例如 ['apple' ...

  9. python学习04——列表的操作

    笨办法学python第38节 如何创建列表在第32节,形式如下: 本节主要是讲对列表的操作,首先讲了 mystuff.append('hello') 的工作原理,我的理解是,首先Python找到mys ...

随机推荐

  1. vue+vue-cli+vuex+vrouter 开发学习和总结

    1.项目目录结构 1.components------------------------->页面中所用的公共组件: 2.router index.js -------------------- ...

  2. Node+Express+MongoDB + Socket.io搭建实时聊天应用实战教程(二)--node解析与环境搭建

    前言 本来开始写博客的时候只是想写一下关于MongoDB的使用总结的,后来觉得还不如干脆写一个node项目实战教程实战.写教程一方面在自己写的过程中需要考虑更多的东西,另一方面希望能对node入门者有 ...

  3. android studio 查看预览所有屏幕分辨率下的显示

    你可以打开在窗口的右侧预览面板设置上的布局.你可以通过修改面板顶部面板改变各种选项来修改预览,包括预览设备,主题,平台版本等等,可以同时预览多个设备上布局,可以从“设备”选项中下拉”预览所有屏幕的尺寸 ...

  4. 洛谷P1432 倒水问题(CODEVS.1226)

    To 洛谷.1432 倒水问题 题目背景 In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were co ...

  5. C语言字符串操作详细总结

    1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度 ...

  6. vs2008快捷键

    Ctrl+E,D ----格式化全部代码 Ctrl+E,F ----格式化选中的代码 CTRL + SHIFT + B生成解决方案 CTRL + F7 生成编译 CTRL + O 打开文件 CTRL  ...

  7. EntityFramework CodeFirst反向工程工具

    EntityFramework Reverse POCO Generator https://marketplace.visualstudio.com/items?itemName=SimonHugh ...

  8. Python根据多个空格Split字符串

    下面的String: 1 沪1 上海市 1850 1350 400 1300 1186/1644(嘉定约100,松江69 奉贤68 2007年上海常住人口1858万人,户籍人口1378.86万人,来沪 ...

  9. 最经典的常用拍照姿势大全,顶级POSE

    伸出手遮阳光.   捂住一只眼睛.   手放在最旁.这是一个极具诱惑的姿势 站立,背对镜头,扭过来,仰角拍, 俩手按在头两边,歪头,或者直头,表情一般都困惑,迷茫,咬下嘴唇效果更佳.         ...

  10. MySQL 聚簇索引&&二级索引&&辅助索引

    MySQL非聚簇索引&&二级索引&&辅助索引 mysql中每个表都有一个聚簇索引(clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅 ...