专栏首页python3Python自动化开发学习4-3

Python自动化开发学习4-3

JSON 和 pickle

序列化:把数据对象变成字符串的形式,这样可以保存在文件中。反之就是反序列化

python自带的str()可以完成序列化,然后eval()可以反序列化,但是我们先把他们忘记。不知道适用范围是多大。

我们用json的规范来做序列化和反序列化。

import json
dica = {'name':'Alice',
        'age':18,
        'from':'ShangHai'
        }
stra = json.dumps(dica)  # 序列化
print(type(stra),stra)
dica2 = json.loads(stra)  # 反序列化
print(type(dica2),dica2)
strb = '{"name":"Jack","age":22,"from":"BeiJing"}'  # JSON只认双引号,所以字符串内部要双引号
print(type(strb),strb)
dicb = json.loads(strb)  # 反序列化
print(type(dicb),dicb)

一种需求是序列化成字符串之后存入文件保存起来。下次要用的时候再读取文件,反序列化生成之前的数据。对于这种情况,对应有两个便捷的方法可以直接完成。

import json
dica = {'name':'Alice',
        'age':18,
        'from':'ShangHai'
        }
with open("testjson.txt",'w',encoding='utf-8') as file:
    json.dump(dica,file)

可以去查看一下,运行目录下是否生成了一个文件。然后再来反序列化

import json
with open("testjson.txt",'r',encoding='utf-8') as file:
    data = json.load(file)
print(type(data),data)

上面的JSON的序列化并不支持python所有的数据类型。但是JSON是通用的规范,也就是JSON序列化之后的数据到其他语言环境也能识别。

对于不支持的数据类型,应该可以加一步编解码,但是如果别的语言环境也不支持这个数据类型,那么即使能序列化也没有用。

不过python序列化保存之后再给python反序列化使用,就没有数据类型的问题,那么可以使用pickle。

python的pickle模块实现了python的所有数据序列和反序列化。基本上功能使用和JSON模块没有太大区别,方法也同样是dumps/dump和loads/load

import pickle
dica = {'name':'Alice',
        'age':18,
        'from':'ShangHai'
        }
stra = pickle.dumps(dica)  # 序列化
print(type(stra),stra)  # 这里bytes类型了,只有二进制类型才有可能把所有的数据类型都序列化
dica2 = pickle.loads(stra)  # 反序列化
print(type(dica2),dica2)

软件目录开发规范

假设项目名称是Foo,项目名称的首字母大写。下面是一个简单的目录结构:

Foo/ |-- bin/ |   |-- foo | |-- foo/ |   |-- tests/ |   |   |-- __init__.py |   |   |-- test_main.py |   | |   |-- __init__.py |   |-- main.py | |-- docs/ |   |-- conf.py |   |-- abc.rst | |-- setup.py |-- requirements.txt |-- README

  1. bin/: 存放项目的一些可执行文件,当然你可以起名script/之类的也行。
  2. foo/: 存放项目的所有源代码。(1) 源代码中的所有模块、包都应该放在此目录。不要置于顶层目录。(2) 其子目录tests/存放单元测试代码; (3) 程序的入口最好命名为main.py
  3. docs/: 存放一些文档。
  4. setup.py: 安装、部署、打包的脚本。
  5. requirements.txt: 存放软件依赖的外部Python包列表。
  6. README: 项目说明文件。

不同目录间进行模块调用

python里一个文件夹下如果有一个__init__.py的空文件,这就不是一个普通的文件夹了,这是一个包。

要调用包里的模块,可以使用:from 包名 import 模块名

要能够调用,还要先保证包的上级目录在环境变量里。要动态的获取到程序的目录和上级目录,并且导入环境变量,看下面的例子:

import os,sys
print(__file__)  # 打印相对路径
print(os.path.abspath(__file__))  # 打印绝对路径
print(os.path.dirname(os.path.abspath(__file__)))  # 打印上一级目录,这里是去掉了文件名
print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))  # 打印再上一级目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # 只要这句,上面都不要
print(sys.path)  # 打印当前的环境变量
sys.path.append(BASE_DIR)  # 添加环境变量,这句也要。
print(sys.path)  # 看看现在的环境变量是否有增加

实际使用时,我们只需要上面的2句就可以了。

作业

员工信息表:

staff_id

name

age

phone

dept

enroll_date

1

Adam Liu

25

13562984561

IT

2013-04-01

2

Barry Allen

22

13659874522

HR

2015-05-03

3

Clark Kent

30

13156998456

Sales

2016-04-22

4

Eddie Thawne

40

13566942130

HR

2009-03-01

不过这个表可能是这样存在你的文件里的:

1,Adam Liu,25,13562984561,IT,2013-04-01

现需要对这个员工信息文件,实现增删改查操作

一、可进行模糊查询,语法至少支持下面3种:

  1.   select name,age from staff_table where age > 22
  2.   select  * from staff_table where dept = "IT"
  3.       select  * from staff_table where enroll_date like "2013"
  4. 查到的信息,打印后,最后面还要显示查到的条数 

二、可创建新员工纪录,以phone做唯一键,staff_id需自增

三、可删除指定员工信息纪录,输入员工id,即可删除

四、可修改员工信息,语法如下:

  update staff_table set dept="Market" where dept = "IT"

注意:以上内容要充分使用函数,最大限度减少重复代码。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python-sys模块

    sys模块最常用的就只有两个,sys.argv和sys.exit,sys.argv返回一个列表,包含了所有的命令行参数,sys.exit则是退出程序。再就是可以...

    py3study
  • Python学习笔记 --- 序列化Serialization

    序列化 (serialization) 序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,

    py3study
  • python序列化:json,pickl

    什么是序列化,把程序中的对象或者变量,从内存中转换为可存储或可传输的过程称为序列化。在 Python 中,这个过程称为 pickling,在其他语言中也被称为 ...

    py3study
  • redis反序列化出现:java.lang.ClassNotFoundException异常

    不知道大家在使用redis的时候,有没有遇到过如下错误:java.lang.ClassNotFoundException,这个错误是因为反序列化时找不到对应的对...

    林老师带你学编程
  • 在 Java 中如何使用 transient

    Java语言的transient不像class、synchronized和其他熟悉的关键字那样众所周知,因而它会出现在一些面试题中。这篇文章我将为大家讲解tra...

    哲洛不闹
  • 序列化与ArrayList 的elementData的修饰关键字transient

      transient用来表示一个域不是该对象序行化的一部分,当一个对象被序行化的时候,transient修饰的变量不会被序列化

    江湖前辈黄药师
  • 奈学:一起了解几种序列化协议

    序列化(编码)是将对象序列化为二进制形式(字节数组),主要用于网络传输、数据持久化等;而反序列化(解码)则是将从网络、磁盘等读取的字节数组还原成原始对象,主要用...

    江帅帅
  • C# 特性(Attribute)之Serializable特性

    本文参考自Serializable 作用,纯属读书笔记,加深记忆 介绍之前,先说一个重要的知识点: Serializable属性并不序列化类,它只是一个标签。至...

    郑小超.
  • 谈谈序列化—实体bean一定要实现Serializable接口?

    导读:最近在做项目的过程中,发现一个问题,就是我们最开始的时候,传递参数包括返回类型,都有map类型。但是由于map每次都要匹配key值,很麻烦。所以在之后就将...

    生活创客
  • 【问底】静行:FastJSON实现详解

    还记得电影《功夫》中火云邪神的一句话:天下功夫,无坚不破,唯快不破。在程序员的世界中,“快”一直是大家苦苦修炼,竞相追逐的终极目标之一,甚至到了“不择手段”、“...

    CSDN技术头条

扫码关注云+社区

领取腾讯云代金券