python(31)——【sys模块】【json模块 & pickle模块】
一、sys模块
import sys
sys.argv #命令行参数List,第一个元素是程序本身路径
sys.exit() #退出程序,正常退出时exit(0)
sys.version #获取python解释程序的版本信息
sys.maxint #最大的int值
sys.path #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform #返回操作系统平台的名称
1. sys.argv (非常重要)
应用:我们之前需要做判断是在程序执行过程中进行逻辑判断和选择。如果需求是在程序还没有执行时,对用户操作进行判断,即直接对程序进行操作和选择
sys_module.py内容如下:
import sys
print(sys.argv)
在终端来执行sys_module.py,命令行后可添加参数(第一个参数为用户要执行的操作,第二个参数为路径),执行结果如下:

sys.arge提供了一个在命令行后面添加参数的机制,通过对相关参数进行解析,可对用户操作在程序执行前进行判断。
sys_module.py内容如下:
import sys
print(sys.argv)
command = sys.argv[1]
path = sys.argv[2]
if command == 'post':
print('post')
elif command == 'get':
print('get')
#终端执行结果如下:

2. 关于环境变量的问题
关于环境变量的修改
#临时修改环境变量方法
import sys
sys.path.append()
#永久修改环境变量方法(如下图所示)

关于from...import...的补充
cal.py的内容如下:
A = 5.20
if __name__=='__main__':
def add_cal(x,y):
return x + y + A
TEST.py的内容如下:
from cal import A
if __name__=='__main__':
print(A)
TEST.py和cal.py的关系如下图所示:

执行TEST.py结果如下:5.2
TEST.py和cal.py的关系如下图所示:

执行TEST.py结果报错,因此需要在TEST.py中人为的添加绝对路径
__file__ == 文件名(但是在pycharm会自动加入绝对路径)
思路一:利用sys.path.append()直接进行绝对路径的添加
import sys
sys.path.append('D:/Users/XIAOHuoguo/PycharmProjects/TF_Learning/day4')
from cal import A
if __name__=='__main__':
print(A)
#结果分析:虽然程序可以正常执行,但是程序可移植性较差
思路二:利用os.path.dirname(path) #返回path的目录,其实就是os.path.split(path)的第一个元素
import sys
import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_DIR)
from cal import A
if __name__=='__main__':
print(A)
#结果分析:虽然程序可以正常执行,但是__file__==文件名,只是pycharm自动添加绝对路径,因此该程序无法再终端执行,会报错
思路三:通过sys.path.abspath()来获取绝对路径
import sys
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
from cal import A
if __name__ == '__main__':
print(A)
#结果分析:程序可以再pycharm和终端正常执行,且可移植性能较好
3. 进度条的实现
import sys
import time
for i in range(50):
sys.stdout.write('*') #向屏幕打印操作,print的内部就是sys.stdout.write()操作
time.sleep(0.1)
sys.stdout.flush() #动态刷新(不添加该语句,则直接全部打印)
二、 json模块 & pickle模块
1. json
- 如果我们要在不同编程语言之间传递对象,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,
- 因为JSON表示出来就是一个字符串,可以被所有语言读取,也方便地存储到磁盘或者通过网络传输
- JSON不仅是标准格式,并且比XML更快,而且可以直接在web页面中读取,非常方便
2. JSON表示的对象就是标准的JavaScript语言的对象,JSON和Python内置的数据类型对应如下:

3. 序列化
- 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化。在Python中叫pickling,在其他语言中被称之为serialization,marshalling等,都是一个意思
- 序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上
- 反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling。
回顾:通过eval()实现数据交换
#对文件进行写操作(只能写入字符串类型)
dic = '{"name": "xhg"}'
f = open('hello', 'w')
f.write(dic)
f.close()
#对文件进行读操作(读初字典name键对应的值xhg)
f_read = open('hello', 'r')
data = f_read.read()
print(type(data))
data = eval(data)
print(data["name"])
f_read.close()
#执行结果:
<class 'str'>
xhg
#结果分析:对文件进行读操作,读出的数据类型为字符串,通过eval()对数据处理,将字符串转换为字典,再进行键值对处理。
上述过程可以通过json模块和pickle模块来进行实现
#利用json进行写操作(序列化)
import json
dic = {'name': 'xhg'}
data = json.dumps(dic)
print(data)
print(type(data))
#执行结果:
{"name": "xhg"}
<class 'str'>
#结果分析:data是json字符串,是所有语言都支持的规范 .json字符串最明显的特征是:各种引号变为双引号。json.dumps()之后,所有数据类型均转化为json字符串(加载成字符串)
#json字符串最明显的特征是:各种引号变为双引号。
dic = {'name': 'alex'} ----> {"name": "alex"}
i = 8 ----> ""
s = 'hello' ----> "hello"
l = [11, 22] ----> "[11, 22]"
#利用json模块对文件进行写操作(序列化)
import json
dic = {'name': 'xxx'}
print(type(dic)) #<class 'dict'>
data = json.dumps(dic)
print(type(data)) #<class 'str'>
f = open('hello','w')
f.write(data)
f.close()
#利用json模块对文件进行读操作(读初字典name键对应的值xhg)(反序列化)
import json
f_read = open('hello', 'r')
data = json.loads(f_read.read())
print(type(data))
print(data)
print(data['name'])
f_read.close() #执行结果:
<class 'dict'>
{'name': 'xxx'}
xxx
#结果分析:json.loads()读出来的数据是最初的数据类型
4. dump & dumps load & loads 区别
#dumps()
import json
dic = {'name': 'xhg'}
f = open('hello','w')
data = json.dumps(dic)
f.write(data)
f.close() #dump()
import json
dic = {'name': 'xxx'}
f = open('hello','w')
json.dump(dic, f)
f.close()
#结论:
#dump() <----> json.dumps();f.write()
#dump()相当于进行了两步操作,load & loads区别同dump & dumps区别,建议使用dumps()和loads()
#提示:并不是只有dumps()之后可以才可以使用loads(),只要你写入的字符串符合json字符串的规定(双引号),就可以使用loads()
5.pickle模块
- pickle模块也是用来做数据交换的,与json模块的区别如下:
- pickle结果是字节,json结果是字符串
- json写进去是可读的(字符串),pickle写进去是不可读的(字节)
- pickle支持的数据类型更多
#利用pickle模块对文件进行写操作(序列化)
import pickle
dic = {'name': 'alex', 'age': 18, 'sex': 'female'}
print(type(dic)) #<class 'dict'>
j = pickle.dumps(dic)
print(type(j)) #<class 'bytes'>
f = open('test_pickle', 'wb') #注意w是写入str,wb是写入bytes,j是‘bytes’
f.write(j)
f.close() #利用pickle模块对文件进行读操作(反序列化)
import pickle
f = open('test_pickle', 'rb')
data = pickle.loads(f.read())
print(data['age'])
python(31)——【sys模块】【json模块 & pickle模块】的更多相关文章
- python全栈开发-json和pickle模块(数据的序列化)
一.什么是序列化? 我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flat ...
- os模块,sys模块,json和pickle模块,logging模块
目录 OS模块 sys模块 json和pickle模块 序列化和反序列化 json模块 pickle logging模块 OS模块 能与操作系统交互,控制文件 / 文件夹 # 创建文件夹 import ...
- 模块讲解---os模块,sys模块,json和pickle模块,logging模块
目录 模块的用法 os模块 常用的功能 sys模块 常用的功能 json和pickle模块 4. logging模块 模块的用法 通过 import 或者from......import...... ...
- python-时间模块,random、os、sys、shutil、json和pickle模块
一.time与datetime模块 time模块: 时间戳:表示的是从1970年1月1日00:00:00开始按秒计算的偏移量,返回类型为float类型 格式化时间字符串(Format String) ...
- python模块(json和pickle模块)
json和pickle模块,两个都是用于序列化的模块 • json模块,用于字符串与python数据类型之间的转换 • pickle模块,用于python特有类型与python数据类型之间的转换 两个 ...
- Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式
Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Py ...
- Python json和pickle模块
用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps. ...
- Python之时间模块、random模块、json与pickle模块
一.时间模块 1.常用时间模块 import time # 时间分为三种格式 #1.时间戳---------------------以秒计算 # start= time.time() # time.s ...
- python常用模块之json、pickle模块
python常用模块之json.pickle模块 什么是序列化? 序列化就是把内存里的数据类型转换成字符,以便其能存储到硬盘或者通过网络进行传输,因为硬盘或网络传输时只接受bytes. 为什么要序列化 ...
- 包--json 与 pickle 模块
一. 包 一个含有__init__.py 文件的文件夹(将py 文件中的内容划分成不同的部分放在不同的py 文件中,在将这些py 文件放在一个文件夹中) 是模块,不做执行文件,仅做调用 m1.py 和 ...
随机推荐
- JSON转Excel
1.引入js (dist目录下JsonExportExcel.min.js) <script src="https://cuikangjie.github.io/JsonExportE ...
- java学习笔记(八):继承、extends、super、this、final关键字
继承解决代码重用的问题,方便管理和维护代码. 继承 子类拥有父类非private的属性,方法. 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展. 子类可以用自己的方式实现父类的方法. Java ...
- Linux云服务器
1. 第一步:前往阿里云官网注册账号,实名认证.进去云服务器,创建实例! 第二步:选配置,**公网IP地址选择“分配”!**如果你是首次购买主机,安全组先不必勾选,或者勾选默认的 .后面,会有安全组的 ...
- [leetcode]37. Sudoku Solver 解数独
Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy ...
- (sealed)密封类及密封方法优缺点
1. 密封类防止被继承 (有利于代码优化, 由于密封类的不被继承性, 代码在搜索此方法时可以直接定位, 不需要一层层的找继承关系) 只有本程序集可以使用 2. 密封类中不需要再写密封方法(一般密封方法 ...
- Log4Net web.config配置
1 .[assembly: log4net.Config.XmlConfigurator(ConfigFile = "web.config", Watch = true)] 写 ...
- CSS的六大选择器
选择器:选择器是一种模式,用于选择需要添加样式的元素. 首先简述六大选择器 基本选择器 标签选择器 类选择器 ID选择器 高级选择器 层次选择器 结构伪类选择器 属性选择器 其中基本选择器与层次选择器 ...
- 重写equals和hashCode的方法
为什么要有 hashCode引用 我们以"HashSet 如何检查重复"为例子来说明为什么要有 hashCode: 当你把对象加入 HashSet 时,HashSet 会先计算对象 ...
- java28
1.使用多态的优点 把要创建的多个子类缩减为一个父类接着传入参数,用参数调用子类的方法, 输出时直接调用父类的方法,这时传参传创建的对象 2.多态方法的调用 调用的方法前有static时,会默认调用父 ...
- Alpha 冲刺 (7/10)
队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 学习MSI.CUDA 试运行软件并调试 ...