《Head First Python》学习笔记 Chapter4:持久化--将数据写入文件

简单文件写入

>>> out = open('data.out', 'w') # 以w模式打开,在写入前会清空文件
>>> print("测试一下",file=out)
>>> out.close() # 一定要进行close,即刷新输出

可以看到在当前工作目录下生成了一个data.out文件,内容为:测试一下。

当尝试往一个不存在的文件写入时,程序首先会创建一个新文件。

读取/写入文件

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:
            pass
    data.close()
except:
    print('文件不存在!')

try:
    man_file = open('man_data.txt','w')
    other_file = open('other_data.txt','w')
    print(man,file=man_file)
    print(other,file=other_file)

    man_file.close()
    other_file.close()
except IOError:
    print('文件异常')

使用with处理文件异常

  • 通常的try/expect/finally方式:
try:
    data = data = open('missing', 'w')
    print(data.readline(), end='')
except IOError as err:
    print('File error' + str(err))
finally:
    if 'data' in locals():
        data.close()
  • 使用with进行处理:
try:
    with open('missing', 'w') as data:
        print("It's...", file=data)
except IOError as err:
    print('File error' + str(err))

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

使用with时,不再需要操心关闭打开的文件,因为python解释器会自动的进行。

pickle

可以保存和加载几乎任何Python数据对象,包括列表。
使用pickle很简单,只需要导入所需的模块,然后使用dump()保存数据,以后再某个时间点可以使用load()来恢复数据。但是这些操作的一个要求就是必须要以二进制访问模式打开这些文件。出现异常时,pickle会产生一个PickleError类型的异常。

import pickle # 一定要导入pickle模块

with open('mydata.pickle', 'wb') as mysavadata: #b代表使用二进制模式打开文件
    pickle.dump([1, 2, 'three'], mysavadata) # 使用dump保存数据文件
with open('mydata.pickle', 'rb') as myrestoredata:
    a_list = pickle.load(myrestoredata) # 使用load从文件恢复数据
print(a_list)

知识点

open()函数

open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None):打开一个文件并返回对应的文件对象,若文件不存在,将抛出OSError异常。

主要参数:

  • file:可以是一个代表文件路径(绝对路径或者相对路径)字符串或者一个包装好的文件对象
  • mode:可选,用以指定文件打开的模式,分为以下几种:
字符 含义
r 只读(默认)
w 只写,并且先将文件清空
x 创建新文件并写入, 若文件已存在则会失败
a 只写,将写入的内容添加到已有内容的后面
b 二进制模式
t 文本模式(默认)
+ 打开硬盘文件用于更新(读和写)

str.strip([chars])函数

没有参数则清除首尾的空白字符,有参数(比如a),怎将首尾中的a全部清除,直到不是a的字符,如:

>>> '   spacious   '.strip()
'spacious'
>>> 'www.example.com'.strip('cmowz.')
'example'

locals():返回当前作用域中的变量集合

当一行代码要使用变量x的值时,Python会到所有可用的名字空间去查找变量,按照如下顺序:

  • 局部名字空间:特指当前函数或类的方法。如果函数定义了一个局部变量x,Python将使用这个变量,然后停止搜索。
  • 全局名字空间:特指当前的模块。如果模块定义了一个名为x的变量,函数或类,Python将使用这个变量然后停止搜索。
  • 内置名字空间:对每个模块都是全局的。作为最后的尝试,Python将假设x是内置函数或变量。

如果Python在这些名字空间找不到x它将放弃查找并引发一个NameError的异常,同时传递There is no variable named 'x'这样一条信息。

象Python中的许多事情一样,名字空间在运行时直接可以访问。特别地,局部名字空间可以通过内置的locals函数来访问。全局(模块级别)名字空间可以通过globals函数来访问。

str()

返回对象的string类型,str(object)将调用object.__str__(),类似于Java中的toString()方法

with语句

有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。

如果不用with语句,代码如下:

file = open("/tmp/foo.txt")
data = file.read()
file.close()

这里有两个问题。一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理。下面是处理异常的加强版本:

file = open("/tmp/foo.txt")
try:
    data = file.read()
finally:
    file.close()

虽然这段代码运行良好,但是太冗长了。这时候就是with一展身手的时候了。除了有更优雅的语法,with还可以很好的处理上下文环境产生的异常。下面是with版本的代码:

with open("/tmp/foo.txt") as file:
    data = file.read()

if/elif

if role == 'Man':
    man.append(line_spoken)
elif role == 'Other Man': # elif相当于 else if
    other.append(line_spoken)

如果觉得有用,欢迎关注我的微信,有问题可以直接交流:

你的关注是对我最大的鼓励!
你的关注是对我最大的鼓励!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容