headfirst python 03, 04
文件与异常
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的更多相关文章
- Python学习--04条件控制与循环结构
Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...
- The Python Challenge 0-4
The Python Challenge 0-4 项目地址:http://www.pythonchallenge.com/ Level-0 提示Hint: try to change the URL ...
- python进阶04 装饰器、描述器、常用内置装饰器
python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...
- Python模块04/包/logging日志
Python模块04/包/logging日志 目录 Python模块04/包/logging日志 内容大纲 1.包 2.logging日志 3.今日总结 内容大纲 1.包 2.logging日志 1. ...
- Python函数04/生成器/推导式/内置函数
Python函数04/生成器/推导式/内置函数 目录 Python函数04/生成器/推导式/内置函数 内容大纲 1.生成器 2.推导式 3.内置函数(一) 4.今日总结 5.今日练习 内容大纲 1.生 ...
- Python面向对象04 /封装、多态、鸭子类型、类的约束、super
Python面向对象04 /封装.多态.鸭子类型.类的约束.super 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 3. 鸭子类型 4. 类的 ...
- python爬虫04 | 长江后浪推前浪,Reuqests库把urllib库拍在沙滩上
最近 有些朋友 看完小帅b的文章之后 把小帅b的表情包都偷了 还在我的微信 疯狂发表情包嘚瑟 我就呵呵了 只能说一句 盘他 还有一些朋友 看完文章不点好看 还来催更 小帅b也只能说一句 继续盘他 ...
- python 03
数据结构 在 python 中有4种内建数据结构, 列表, 元组, 字典和集合. 列表 list 有序项目的数据结构, 类似数组, 是对象. 列表用中括号中用逗号分隔的项目定义.例如 ['apple' ...
- python学习04——列表的操作
笨办法学python第38节 如何创建列表在第32节,形式如下: 本节主要是讲对列表的操作,首先讲了 mystuff.append('hello') 的工作原理,我的理解是,首先Python找到mys ...
随机推荐
- node+express+mongodb初体验
从去年11月份到现在,一直想去学习nodejs,在这段时间体验了gulp.grunt.yeomen,fis,但是对于nodejs深入的去学习,去开发项目总是断断续续. 今天花了一天的时间,去了解整理整 ...
- CF643E. Bear and Destroying Subtrees 期望dp
题目链接 CF643E. Bear and Destroying Subtrees 题解 dp[i][j]表示以i为根的子树中,树高小于等于j的概率 转移就是dp[i][j] = 0.5 + 0.5 ...
- 潭州课堂25班:Ph201805201 WEB 之 CSS 第三课 (课堂笔记)
在 CSS 中第个标签都可以认为是个盒子,盒子就有以下几层 边框 border border-top: 5px solid black; /*上边框 实线*/ border-right: 3px do ...
- Unterminated <c:forEach tag
c:forEach tag意思是这一块有语法错误
- Java基础-多线程-①线程的创建和启动
简单阐释进程和线程 对于进程最直观的感受应该就是“windows任务管理器”中的进程管理: (计算机原理课上的记忆已经快要模糊了,简单理解一下):一个进程就是一个“执行中的程序”,是程序在计算机上的一 ...
- python:函数的高级特性
很多语言中,都允许把函数本身做为参数,传递给其它参数:即所谓的高阶函数.python中也有类似特性: 一.map/reduce.filter.sorted hadoop里的map-reduce思想在p ...
- App架构师实践指南二之App开发工具
App架构师实践指南二之App开发工具 1.Android Studio 2.编译调试---条件断点.右键单击断点,在弹出的窗口中输入Condition条件.---日志断点.右键单击断点,在弹 ...
- c++中string类对象和字符数组之间的相互转换
string类在c++中是一个模板类,位于名字空间std中,注意这里不是string.h,string.h是C字符串头文件. 将string类型转换为字符数组char arr[10];string s ...
- iOS:针对固定数据源,更好的封装cell
一.介绍 在iOS开发中,tableView非常常用,能将其展示出来,它的数据源必不可少.当然数据源有动态下发的,有固定写死的,这里我只探讨固定写死的情况.对于死数据,我们在项目中经常遇到的场景就是我 ...
- SpringMVC+Thymeleaf +HTML的简单框架
一.问题 项目中需要公众号开发,移动端使用的是H5,但是如果不用前端框架的话,只能考虑JS前端用ajax解析JSON字符串了.今天我们就简单的说下前端框架Thymeleaf如何解决这个问题的: 二.开 ...