数据转储
数据转换存储
• 数据的存储交换发生在:
_ 在同一程序的不同片段之间;
_ 在不同的程序之间;
_ 在不同主机之间。
• 这些数据可能存储一些简单的文本和数值,也可能是非常复杂具有结构的一组数据。
• 为了实现数据的存储和交换,有多种相对流行的数据存储交换方式:
_ 文件或数据库。
- INI文件
• INI用来表示简单的、分层次的配置文件,其内涵类似于Python的词典。
• 本质是纯文本文件,但有一些简单的格式。 - INI文件的读写
• 由于格式非常简单,可以基于一般文件的read/write进行存取。
• Python提供了内置库:
import configparser
config = configparser.ConfigParser()
config.add_section('Init')
config.set('Init', 'Server', '127.0.0.1')
config.set('Init', 'Port', '12000')
with open('my.ini', 'wt') as configfile:
config.write(configfile)
- pickle
• Pickle库可以实现任意python对象的存储。
import pickle
todo = ['write a blog post',
'reply an email',
'read a book']
pickle_file = open('todo.pickle', 'wb')
pickle.dump(todo, pickle_file)
- Pickle & cPickle
• Pickle
pickle_file = open('todo.pickle', "rb")
todo = pickle.load(pickle_file)
pickle_file.close()
print(todo)
- JSON
• Pickle仅限于Python程序使用,如何和其他语言交互?
• JSON (JavaScript Object Notation) 是跨语言的轻量级数据交换格式。
• 易于被人工读取、修改,也容易被机器读取和写入。
• 符合 ECMA-262 3rd Edition标准。
• JSON语言无关,它可以方便的被 C, C++, C#,Java, JavaScript, Perl, Python等语言读取和生成。
• 结论:JSON是理想的数据交换格式,可以实
现跨语言的、跨计算机的复杂数据传输。
import json
datastore = { "room‐number": 100,
"use": "reception",
"sq‐ft": 50,
"price": [100, 200, 300]
}
with open("ds.json", 'w') as f:
json.dump(datastore, f)
with open("ds.json", 'r') as f:
data = json.load(f)
print(data)
- 数据库
• 文件存储不适用于大项目,此时需要使用数据库。
• 数据管理系统 Database Management System= DBMS
_ 一系列存储数据的文件;
_ 一系列程序用于访问和更新其中的数据。
• 目前最流行的数据库是关系型数据库。 - SQLite
• SQlite 是开源的数据库,可以嵌入在其他程序中,不需要安装。
• 单机版本,不能并发、不能网络访问、不需要用户名密码鉴权(但可以加密)。
• Portable – 仅使用了ANSI-standard C语言,因此可在各种平台编译;
• Reliable – 良好的测试,开源代码;
• Small – 300 kb 的库,只需要16kb的stack和100kb的heap,甚至可以运行在单片机上。 - 建库
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('''CREATE TABLE money
(日期, 姓名, 支出)''')
for d, n, m in [("2019‐4‐1", "Li Lei", 52),
("2019‐4‐2", "Han Meimei", 300),
("2019‐4‐5", "Li Lei", 230),
("2019‐4‐8", "Li Lei", 170),
("2019‐4‐10", "Han Meimei", 96)]:
c.execute("INSERT INTO money VALUES (?,?,?)",(d,n,m))
conn.commit()
conn.close()
- 用库
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
result = c.execute('''select 姓名, 支出
from money where 支出>100;''')
for row in result:
name = row[0]
pay = row[1]
print(f"{name} pay {pay}>100")
conn.close()
- 其他格式
• MAT:Matlab数据存储格式
• Python可以直接读取MAT文件,Python也可以调用Matlab完成特定任务。
目录处理
• 查找目录下的子目录和文件
_ glob库
• 遍历目录
_ os.walk方法
- 实例
import os
from os.path import join, getsize
for root, dirs, files in os.walk('.'):
print("root=", root)
print(sum(getsize(join(root, name)
) for name in files), end="")
print("bytes in", len(files),
"non‐directory files")
测试和调试
- 测试驱动Test-driven开发
• pytest是一个强大的Python测试工具。
• pytest是软件测试框架,它会自动找到用户写的测试用例,运行测试并报告结果。
• 支持插件或第三方扩展
• 容易与其他工具对接。
• pip install pytest - 规则
• pytest 测试样例的规则:
_ 测试文件以 test_ 开头(以 test 结尾也可以)
_ 测试类以 Test 开头,并且不能带有 init 方法
_ 测试函数以 test 开头
_ 断言使用基本的 assert 即可
• pytest自动执行所有的测试,并报告通过和失败的测试用例数量。 - print-调试
- 使用日志文件
• 对大规模程序长期运行而言,故障的机会是很少的,难以通过print获得;
• 日志是一种非常好的手段,可以用于记录程序运行过程中的各种信息。
• 理想的日志可以用来恢复和重现程序的运行过程。
• 内置的logging库。 -
日志等级
image.png - 利用IPython.embed调试
• from IPython import embed
• 在需要调试的位置加入embed()函数
• 可以在现场运行python解释器,可以自由执行任何python语句,包括:
_ 打印输出任何变量
_ 修改和删除任何变量
• print/logging应对复杂数据结构的能力不足,embed()是较为理想的选择。
网友评论