json和pickle
用于序列化的两个模块
json,用于字符串 和 python数据类型间进行转换
pickle,用于python特有的类型 和 python的数据类型间进行转换
json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
json dumps把数据类型转换成字符串 dump把数据类型转换成字符串并存储在文件中 loads把字符串转换成数据类型 load把文件打开从字符串转换成数据类型
pickle同理
现在有个场景在不同设备之间进行数据交换很low的方式就是传文件,dumps可以直接把服务器A中内存的东西发给其他服务器,比如B服务器、
在很多场景下如果用pickle的话那A的和B的程序都的是python程序这个是不现实的,很多时候都是不同的程序之间的内存交换怎么办?就用到了json(和html类似的语言)
并且josn能dump的结果更可读,那么有人就问了,那还用pickle做什么不直接用josn,是这样的josn只能把常用的数据类型序列化(列表、字典、列表、字符串、数字、),比如日期格式、类对象!josn就不行了。
为什么他不能序列化上面的东西呢?因为josn是跨语言的!
具体实例如下
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 =