经过上几章的学习,完成如下任务:读取一个文本文件里的内容,将每一行的内容按“:”分割成两部分,根据分割出第一项判断并分别放入两个列表里,去除首尾空白,在屏幕上打印。

# 两个列表用于存储数据
man=[]
other=[]
try:
data=open("demo.txt", encoding="utf-8")  #文件里的内容类似“man:hello。\n woman:hello.\n man:how are you. \n woman:yes.”如果有中文别忘了编码这个大坑
for each_line in data:  #循环读取
try:
(role, line_spoken)=each_line.split(":", 1)  #分割出的内容存放在元组里,元组是不可变的
line_spoken=line_spoken.strip()         #去除首尾空白(跟c#不一样啊)
if role=="man":
man.append(line_spoken)            #在末尾添加内容
else:
other.append(line_spoken)
except ValueError:
pass
except IOError:
print("IOError")
finally:  #这一段的代码是即使上面发生了异常也会执行
  data.close()
print(man)
print(other)

这算是复习前面的内容,根据前面的学习,你能做出来吗(我除了strip去空白外都完成了,其实很多语言大体是相通的,所以有一门语言的基础,学习那一系的语言都不会太难(c#和python都算是c系的吧))

接下来介绍以写入模式打开文件,上一篇文章已经介绍了open的参数传入“w”就可以写入文件。然后是print,既可以向屏幕输出文本,也可以向文件写入文本,只要传入参数file=out即可以把字符串传入文本

下面我们来实验一下吧:

# 还记得吗w是如果文件存在就会清除原有内容,所以用+表示更新文本而不清除原有内容
out=open("demo.txt", "w+")
print("write something in file", file=out)
out.close()
# 关闭非常重要,一定要关闭文件以确保数据被保存至文件。

那么我们继续,想上面的生成的两个列表分别保存值两个文件里

    manout=open("manout.txt", "w")
for line in man:
print(line, file=manout)
otherout=open("otherout.txt", "w")
for line in other:
print(line, file=otherout)
manout.close()
otherout.close()

将这一段加入到上面的代码的最后。执行后创建了两个新文件并写入了读取来的内容。注意把关闭文件的代码放到finally里面去。

那么问题来了:学挖掘机哦不,是关闭文件每次都要写,挺麻烦的也没有其他方法呢,c#里有using可以释放资源,python里也有:with

with open("manout.txt", "w") as manout:
for line in man:
print(line, file=manout)
with open("otherout.txt", "w") as otherout:
for line in other:
print(line, file=otherout)

这一段代码等价于上一段,而不需要你在写额外的关闭代码。那么,你能把最上面的那一段读取的代码也改掉吗?

腌制数据

听起来有点怪,我查了一下词典,pickle还真是腌制的意思。

python里有一个库叫pickle,可以用于保存和加载然后python数据对象,比如列表。

pickle是以二进制方式保存的,所以保存的文件就不能打开查看了。他提供了两个函数:dump()和load()用于保存和恢复数据。让我们改写上面的代码

# 使用前要导入pickle库
import pickle
  #pickle要求以二进制方式打开文件
with open("manout.txt", "wb") as manout:
pickle.dump(man, manout)
with open("otherout.txt", "wb") as otherout:
pickle.dump(other, otherout)
  #加载数据
  with open("manout.txt", "rb", encoding="utf-8") as manread:
    data = pickle.load(manread)

现在你已经把数据保存到“数据库”里了,那么第四章持久存储就介绍到这里

1.用strip去除空白

2.给open函数出入“w”写入文件

3.使用with自动关闭文件

4.使用pickle库的dump()和load()保存和恢复数据

你看,其实python也不难嘛。

Head First Python学习笔记3——持久存储的更多相关文章

  1. OpenCV之Python学习笔记

    OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...

  2. Python学习笔记(十四)

    Python学习笔记(十四): Json and Pickle模块 shelve模块 1. Json and Pickle模块 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不 ...

  3. Python学习笔记(十一)

    Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...

  4. Python学习笔记(六)

    Python学习笔记(六) Ubuntu重置root密码 Ubuntu 16.4 目录结构 Ubuntu 命令讲解 1. Ubuntu重置root密码 启动系统,显示GRUB选择菜单(如果默认系统启动 ...

  5. Python学习笔记,day5

    Python学习笔记,day5 一.time & datetime模块 import本质为将要导入的模块,先解释一遍 #_*_coding:utf-8_*_ __author__ = 'Ale ...

  6. Deep learning with Python 学习笔记(1)

    深度学习基础 Python 的 Keras 库来学习手写数字分类,将手写数字的灰度图像(28 像素 ×28 像素)划分到 10 个类别 中(0~9) 神经网络的核心组件是层(layer),它是一种数据 ...

  7. 雨痕 的《Python学习笔记》--附脑图(转)

    原文:http://www.pythoner.com/148.html 近日,在某微博上看到有人推荐了 雨痕 的<Python学习笔记>,从github上下载下来看了下,确实很不错. 注意 ...

  8. Python学习笔记_Python对象

    Python学习笔记_Python对象 Python对象 标准类型 其它内建类型 类型对象和type类型对象 Python的Null对象None 标准类型操作符 对象值的比較 对象身份比較 布尔类型 ...

  9. Python学习笔记之文件处理

    1.打开和关闭 要打开文件可以使用函数 open(),它位于自动导入模块 io 中.函数将文件名作为唯一不可缺少的函数,并返回一个文件对象.它还有一个名叫 mode 的参数,用于指定文件模式,其可取值 ...

随机推荐

  1. 在centos7升级jenkins

    找到jenkins的位置 使用下面的命令 ps -aux | grep jenkins enkins    5954  7.9 22.5 2695800 421088 ?      Ssl  20:5 ...

  2. 3-WIN10系统及开发工具支持

    本篇博客对应视频讲解 回顾 上一讲说了编程的方向和技术流派以及选择入门语言的建议.当我们决定我们的选择之后呢,我们就要学习和进行实践操作了.但在实践之前,我们仍然需要做好相应的准备,这也就是今天要讲的 ...

  3. “全栈2019”Java多线程第二十二章:饥饿线程(Starvation)详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. Python 断言 assert 的用法

    assert 后边接的表达式的返回值必须是布尔值 assert expression, "对错误的描述信息" 如果expression表达式返回的是True, 程序正常执行, 如果 ...

  5. MySQL(增删改查补充)

    SQL语句数据行操作补充             create table tb12(                 id int auto_increment primary key,       ...

  6. jvm高级特性(5)(1)(原子性,可见性,有序性,volatile,概述)

    JVM高级特性与实践(十二):高效并发时的内外存交互.三大特征(原子.可见.有序性) 与 volatile型变量特殊规则 简介: 阿姆达尔定律(Amdahl):该定律通过系统中并行化与串行化的比重来描 ...

  7. call、apply、bind的异同

    一.call.apply.bind的异同 JavaScript中函数可以通过3种方法改变自己的this指向,它们是call.apply.bind.它们3个非常相似,但是也有区别.下面表格可以很直观看出 ...

  8. Nginx+Tomcat搭建负载均衡

    一.       工具 nginx-1.8.0 apache-tomcat-6.0.33 二.    目标 实现高性能负载均衡的Tomcat集群: 三.    步骤 1.首先下载Nginx,要下载稳定 ...

  9. MVC Filter中加入验证并跳转

    public class BuildingFilter : ActionFilterAttribute { /// <summary> /// 验证 Building Cookie add ...

  10. C# 5.0-.Net新特性

    调用者信息特性 CallerMemberNameAttribute | CallerFilePathAttribute | CallerLineNumberAttribute .NET Framewo ...