Python:数据存储与程序调试

Python基础知识

数据转储

数据转换存储

• 数据的存储交换发生在:
_ 在同一程序的不同片段之间;
_ 在不同的程序之间;
_ 在不同主机之间。
• 这些数据可能存储一些简单的文本和数值,也可能是非常复杂具有结构的一组数据。
• 为了实现数据的存储和交换,有多种相对流行的数据存储交换方式:
_ 文件或数据库。

  • 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()是较为理想的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackHCC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值