python之旅六【第六篇】模块
json和pickle
用于序列化的两个模块
json,用于字符串 和 python数据类型间进行转换
pickle,用于python特有的类型 和 python的数据类型间进行转换
json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
json dumps把数据类型转换成字符串 dump把数据类型转换成字符串并存储在文件中 loads把字符串转换成数据类型 load把文件打开从字符串转换成数据类型
pickle同理
import json
'''
json dumps把数据类型转换成字符串 dump把数据类型转换成字符串并存储在文件中
loads把字符串转换成数据类型 load把文件打开从字符串转换成数据类型
'''
name = {'name':'dicky','age':}
print type(json.dumps(name)) #数据类型转换成字符串
print json.dumps(name)
print json.loads(json.dumps(name))
print type(json.loads(json.dumps(name))) #字符串转换成字典 结果
<type 'str'>
{"age": , "name": "dicky"}
{u'age': , u'name': u'dicky'}
<type 'dict'>
'''
dump把数据类型转换成字符串并存储在文件中
load把文件打开从字符串转换成数据类型
'''
new_list = {'age':,'work':'IT'}
with open ('test1','w') as openfile:
json.dump(new_list,openfile)
print "以上就是dump......." with open('test1','rb') as readfile:
result=json.load(readfile)
print "load完成",type(result)
print result 结果
以上就是dump.......
load完成 <type 'dict'>
{u'age': , u'work': u'IT'}
ConfigParser
用于对特定的配置进行操作,当前模块的名称在 python 3.x 版本中变更为 configparser。
import ConfigParser '''
test1
[section1]
name = dicky
k2 = v2
age = [section2]
k1 = v1
work=IT
[shuaige]
name = dicky
'''
config=ConfigParser.ConfigParser()
config.read('test1')
#读取
sec=config.sections()
print sec
option=config.options('section1')
print option
item=config.items('section1')
print item
val = config.get('section1','name')
print val
val1 = config.getint('section1','age')
print val1
#修改
sec1=config.remove_section('section3') #删除色彩tion3
config.write(open('test1','w'))
# sec = config.add_section('shuaige')
# config.write(open('test1','w'))
#
# config.set('shuaige','name','dicky')
# config.write(open('test1','w')) config.remove_option('section2','work')
config.write(open('test1','w')) 结果
['section1', 'section2', 'shuaige']
['name', 'k2', 'age']
[('name', 'dicky'), ('k2', 'v2'), ('age', '')]
dicky
操作系统相关命令
os.system() #执行系统命令
其他的都废弃掉了,以后使用subprocess代替了
主要介绍subprocess
call
subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
执行命令,返回状态码
ret = subprocess.call(["ls", "-l"], shell=False)
ret = subprocess.call("ls -l", shell=True)
shell = True ,允许 shell 命令是字符串形式,也就是使用shell来执行,一般情况下,我们要使用shell=False,也是默认的一种形式,模式就是shell=False
check_call
subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
执行命令,如果执行状态码是 ,则返回0,否则抛异常
subprocess.check_call(["ls", "-l"])
subprocess.check_call("exit 1", shell=True)
check_output
subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
执行命令,如果状态码是 ,则返回执行结果,否则抛异常
subprocess.check_output(["echo", "Hello World!"])
subprocess.check_output("exit 1", shell=True)
捕获异常
若要在结果中捕获标准错误,可以使用 stderr=subprocess.STDOUT
>>> subprocess.check_output(
... "ls non_existent_file; exit 0",
... stderr=subprocess.STDOUT,
... shell=True)
'ls: non_existent_file: No such file or directory\n'
Popen
class subprocess.Popen(args, bufsize=, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=)
参数
args:shell命令,可以是字符串或者序列类型(如:list,元组)最好传入序列
bufsize:指定缓冲。 无缓冲, 行缓冲,其他 缓冲区大小,负值 系统缓冲
stdin, stdout, stderr:分别表示程序的标准输入、输出、错误句柄
preexec_fn:只在Unix平台下有效,用于指定一个可执行对象(callable object),它将在子进程运行之前被调用
close_sfs:在windows平台下,如果close_fds被设置为True,则新创建的子进程将不会继承父进程的输入、输出、错误管道。
所以不能将close_fds设置为True同时重定向子进程的标准输入、输出与错误(stdin, stdout, stderr)。
shell:同上
cwd:用于设置子进程的当前目录
env:用于指定子进程的环境变量。如果env = None,子进程的环境变量将从父进程中继承。
universal_newlines:不同系统的换行符不同,True -> 同意使用 \n
startupinfo与createionflags只在windows下有效
将被传递给底层的CreateProcess()函数,用于设置子进程的一些属性,如:主窗口的外观,进程的优先级等等
args
如果args 是一个字符串,该字符串将解释为要执行的程序的名字或路径。然而,这只能在不传递参数给程序时可行。
如下解决
前提是创建好文件egg.txt
>>> import shlex, subprocess
>>> command_line = raw_input()
/bin/vikings -input eggs.txt -output "spam spam.txt" -cmd "echo '$MONEY'"
>>> args = shlex.split(command_line)
>>> print args
['/bin/vikings', '-input', 'eggs.txt', '-output', 'spam spam.txt', '-cmd', "echo '$MONEY'"]
>>> p = subprocess.Popen(args) # Success!
简单执行命令
ret1 = subprocess.Popen(["mkdir","t1"])
ret2 = subprocess.Popen("mkdir t2", shell=True)
Popen 类的实例具有以下方法
Popen.poll() 检查子进程是否已经终止
Popen.wait() 等待子进程终止
Popen.communicate(input=None)
与进程交互:将数据发送到标准输入。从标准输出和标准错误读取数据,直至到达文件末尾。等待进程终止。可选的input 参数应该是一个要发送给子进程的字符串,如果没有数据要发送给子进程则应该为None。
注意如果你需要发送数据到进程的标准输入,你需要以stdin=PIPE创建Popen对象。类似地,在结果的元组中若要得到非None的数据,你还需要给出stdout=PIPE和/或stderr=PIPE。
Popen.send_signal(signal) 发送信号signal 给子进程。
Popen.terminate() 终止子进程。
Popen.kill() 杀死子进程。
Popen.stdin 如果stdin 参数为PIPE,则该属性为一个文件对象,它提供子进程的输入。否则,为None。
Popen.stdout 如果stdout 参数为PIPE,则该属性是一个文件对象,它提供子进程中的输出。否则,为None。
Popen.stderr 如果stderr 参数为PIPE,则该属性是一个文件对象,它提供子进程中的错误输出。否则,为None。
Popen.pid 子进程的进程ID。
注意如果你设置shell 参数为True,那么它是产生的shell的进程ID。
依赖,进入某环境输入
import subprocess obj = subprocess.Popen("mkdir t3", shell=True, cwd='/home/dev',)
保存输出
import subprocess obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out_error_list = obj.communicate('print "hello"')
print out_error_list import subprocess obj = subprocess.Popen(["ls"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out_error_list = obj.communicate()
print out_error_list
另外一种
stdout.read()
import subprocess obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
obj.stdin.write('print 1 \n ')
obj.stdin.write('print 2 \n ')
obj.stdin.write('print 3 \n ')
obj.stdin.write('print 4 \n ')
obj.stdin.close() cmd_out = obj.stdout.read()
obj.stdout.close()
cmd_error = obj.stderr.read()
obj.stderr.close() print cmd_out
print cmd_error
加密模块
md5已经废弃
import md5
hash = md5.new()
hash.update('admin')
print hash.hexdigest()
sha废弃
import sha
hash = sha.new()
hash.update('admin')
print hash.hexdigest()
hashlib替代了以上的加密
import hashlib
hash = hashlib.md5()
hash.update('admin')
print hash.hexdigest()
sha加密
hash = hashlib.sha1()
hash.update('admin')
print hash.hexdigest()
其他的一样,就不一一列举了
以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
import hashlib # ######## md5 ######## hash = hashlib.md5('898oaFs09f') #自定义的key
hash.update('admin')
print hash.hexdigest()
还不够吊?python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密
import hmac
h = hmac.new('wueiqi')
h.update('hellowo')
print h.hexdigest()
日志模块logging
简单用法
import logging logging.basicConfig(filename='log.log',
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p',
level=) logging.debug('debug')
logging.info('info')
logging.warning('warning')
logging.error('error')
logging.critical('critical')
logging.log(,'log') 级别
CRITICAL =
FATAL = CRITICAL
ERROR =
WARNING =
WARN = WARNING
INFO =
DEBUG =
NOTSET =
python之旅六【第六篇】模块的更多相关文章
- 【Python之旅】第六篇(七):开发简易主机批量管理工具
[Python之旅]第六篇(七):开发简易主机批量管理工具 python 软件开发 Paramiko模块 批量主机管理 摘要: 通过前面对Paramiko模块的学习与使用,以及Python中多线程与多 ...
- python之旅九【第九篇】socket
什么是socket 建立网络通信连接至少要一对端口号(socket).socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket ...
- python之旅4[第四篇]
常用内置函数 map 遍历序列,对序列中的每个元素操作,获取新的序列 如下 对所有元素加10 li = [,,,] def func(arg): new_list = map(func,li) pr ...
- 【Python之路】第六篇--Python基础之模块
模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...
- Python之路【第六篇】:模块与包
目录 一 模块 3.1 import 3.2 from ... import... 3.3 把模块当做脚本执行 3.4 模块搜索路径 3.5 编译python文件 3.6 标准模块 3.7 dir ...
- Python之路【第六篇】:socket
Python之路[第六篇]:socket Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字&quo ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验六:数码管模块
实验六:数码管模块 有关数码管的驱动,想必读者已经学烂了 ... 不过,作为学习的新仪式,再烂的东西也要温故知新,不然学习就会不健全.黑金开发板上的数码管资源,由始至终都没有改变过,笔者因此由身怀念. ...
- python学习之旅(十六)
Python基础知识(15):模块 1.可以把模块想象成导入Python以增强其功能的扩展 2.任何程序都可以作为模块导入 3.导入模块并不意味着在导入的时候执行某些操作,它们主要用于定义变量.函数和 ...
- python成长之路第三篇(4)_作用域,递归,模块,内置模块(os,ConfigParser,hashlib),with文件操作
打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.作用域 2.递归 3.模块介绍 4.内置模块-OS 5.内置模块-ConfigParser 6.内置模块-has ...
随机推荐
- Vue.js 系列教程 1:渲染,指令,事件
原文:intro-to-vue-1-rendering-directives-events 译者:nzbin 如果要我用一句话描述使用 Vue 的经历,我可能会说“它如此合乎常理”或者“它提供给我需要 ...
- ESP8266-Arduino杀手?
Arduino之所以流行可能是因为它的学习曲线比较平缓,另外是支持它的第三方程序库非常多,无论在什么平台上都比较容易入门.多年前我曾和一些搞嵌入开发多年的朋友请教,他们更建议我多点尝试STM的开发,A ...
- Intellij IDEA创建的Web项目配置Tomcat并启动Maven项目
本篇博客讲解IDEA如何配置Tomcat. 大部分是直接上图哦. 点击如图所示的地方,进行添加Tomcat配置页面 弹出页面后,按照如图顺序找到,点击+号 tomcat Service -> L ...
- MapReduce中map并行度优化及源码分析
mapTask并行度的决定机制 一个job的map阶段并行度由客户端在提交job时决定,而客户端对map阶段并行度的规划的基本逻辑为:将待处理数据执行逻辑切片(即按照一个特定切片大小,将待处理数据划分 ...
- oracle表空间不足,ORA-00604的解决方法
参考文章: http://blog.chinaunix.net/uid-26446098-id-3344813.html 错误信息如下: 从错误的角度可以推出:应该是表空间不足 根据查看表空间的使用情 ...
- Kickstart Practice Round 2017---A
Problem The Constitution of a certain country states that the leader is the person with the name con ...
- Python—生成器
列表生成式 现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求你把列表里的每个值加1,你怎么实现? >>> a = [i+1 for i in r ...
- jQuery基础语法知识梳理
一.attr() attr()方法设置或返回元素的属性. attr(属性名):获取元素属性名的值. attr(属性名,属性值):设置元素属性名的值. 例子: <a href=”http://12 ...
- NET 使用 RabbitMQ
NET 使用 RabbitMQ 前言 最近项目要使用RabbitMQ,园里里面已经有很多优秀的文章,Rabbitmq官网也有.net实例.这里我尝试下图文并茂之形式记录下使用的过程. 安装 Rabbi ...
- MySQL数据性能优化-修改方法与步骤
原文:http://bbs.landingbj.com/t-0-240421-1.html 数据库优化应该是每个设计到数据库操作应用必须涉及到的操作. 经常调试修改数据库性能主要有三个方面 1.MyS ...