python object对象, object['xxx'] = xxx, 是何用法?

博客分类:
工作中经常要和服务器、数据库这些打交道,有些小功能例如:服务监控、数据监控等用java往往无处下手,即使能做也要花费很长的时间,身边好几个同事都会Python,面对这些需求他们往往优先选择Python来实现,又快又省事。所以我也计划着自学一下Python,寻思着买一本入门的书来参考,在豆瓣上挑来挑去最后挑了《Head first Python》这本。买来后断断续续看了好几章了,对Python也有了一些基本的了解,不过一直没真正上手。
废话太多,直接步入正题,昨天领导让我写个脚本来实时监控某个服务的日志,监控日志中报出的用户购买超时的现象,如果某个node累计超时次数达到10次则通过邮件和短信告警。
需求就是上面说的这样,虽然Python用的还不熟练,不过当下也没其它好的方式来实现,没办法,赶鸭子上架,现学现用,如果碰到不会的就借助于万能的互联网吧
一、Python调用shell
首先考虑实现的方式,由于领导要求实时监控,所以当前想到的方式就是使用linux shell的tail命令扫描服务日志,然后再使用关键字来grep,根据grep出来的日志内容进行分析。这时候碰到了第一个问题,如何在Python中执行linux shell命令呢?
没办法,上网求助,网上有人推荐使用os.system,不过大部分都推荐使用subprocess模块来实现,通过官方文档说明,我决定使用subprocess
有这么一段话:
The subprocess module allows you to spawn new processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace several other, older modules and functions, such as:os.systemos.spawn*os.popen*popen2.*commands.*
翻译过来的意思大致就是:subprocess模块允许你新建子进程,可以连接到进程的输入、输出、异常通道,并且可以获取到子进程的返回值,这个模块是Python用来替代一些其它过时的模块和功能的。
所以说,官方推荐使用subprocess来实现类似的功能。
要使用subprocess,首先必须import该模块
import subprocess
要调用shell命令,subprocess有很多方式,比如call、Popen等,这里我们使用Popen
首先看一个最简单的实例:
subprocess.Popen('ls -l',stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
上面的代码构建了一个Popen对象,Popen的构造函数格式如下:
subprocess.Popen(args, bufsize=0, 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=0)
参数args可以是字符串或者序列类型(如:list,元组),用于指定进程的可执行文件及其参数。如果是序列类型,第一个元素通常是可执行文件的路径。
参数stdin, stdout, stderr分别表示程序的标准输入、输出、错误句柄。他们可以是PIPE,文件描述符或文件对象,也可以设置为None,表示从父进程继承。
如果参数shell设为true,程序将通过shell来执行。
关于其它具体的参数的说明,参见官方文档:
不想看英文的可以看网上的另一篇博客:
我的代码逻辑如下:
#日志文件目录和名称
filename = '/home/project/logs/xxx.log'
#要执行的shell命令
command='tail -f '+filename+'|grep "timeout"'
popen=subprocess.Popen(command,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
while True:
#获取当前grep出来的日志文本行
line=popen.stdout.readline().strip()
#对日志文本进行分析(这里省略)
二、Python发送http请求
上面已经提到,告警的方式为邮件和短信,我们的短信推送接口是一个http接口,所以如果需要短信告警,则需要通过python来请求该http接口。python中一共有urllib、urllib2、httplib、httplib2支持发送http请求,由于服务器上没有安装python的httplib和httplib2模块,所以只能使用urllib,urllib2
使用GET请求来请求短信推送接口,可以把参数写在url中,如果使用POST方式来请求接口,则数据必须放在data或者body中,不能放在url中,放在url中将被忽略。
附上一个通过urllib,urllib2发送GET请求的示例:
import urllib,urllib2
def main():
url="/s?wd=douban"
req = urllib2.Request(url)
res_data = urllib2.urlopen(req)
res = res_data.read()
if __name__ == '__main__':
关于python对http请求的操作,可以参见博客:
三、脚本进程和子进程的退出
发现了2个问题:
问题1:在上面的代码中,python调用的shell tail命令作用是实时监控当前的日志,而服务是24小时不间断的,该python脚本也一直同步执行,所以只能使用nohup方式后台启动。每次要关闭该脚本,手动通过进程pid来kill。带来了一个新的问题,每次kill掉python主进程时,主进程执行时启动的Popen子进程未关闭,由于调试时曾经连续启动-&kill-&启动-&kill多次,导致系统中出现了一大堆tail日志的进程,这是我原来没有预料到的。
问题2:我们的日志是生成的dailyRolling日志,文件名称为:xxx_dailyRolling.log,每天的0点会自动重命名为xxx_dailyRolling.logyyyyMMdd,yyyyMMdd代表前一天的日期,例如xxx_dailyRolling.log,如果tail -f xxx_dailyRolling.log命令一直执行,到0点时会中断,所以我还需要在每天0点前停止当前的python脚本,然后在第二天0点后定时启动此python脚本
综上,2个问题一起解决,在0点前停止python脚本前先kill掉Popen子进程,然后再停止就OK了。
我的思路时每天设置一个固定的时间点,例如就定为每天的23:30:00(因为我们的服务在凌晨时基本上没人使用,监控的目的主要是为了监控白天高峰期时的服务情况,所以23:30到0点这段时间即使没监控也不影响),然后在Popen子进程执行时判断当前时刻是否到了23:30:00,如果已经到了,则终止子进程。通过实践证明,如果Popen子进程终止了,如果python主进程里没有挂起的其余子进程在执行,则主进程也会终止。
Popen可以通过terminate()或者kill()函数来终止当前的子进程。在执行了terminate()后,如果不想立即终止,可以通过wait()或poll()函数来等待子进程执行结束,关于各函数的使用,具体参考官方文档。
各函数说明如下:
Popen.poll()Check if child process has terminated. Set and return returncode attribute.Popen.wait()Wait for child process to terminate. Set and return returncode attribute.Popen.terminate()Stop the child. On Posix OSs the method sends SIGTERM to the child. On Windows the Win32 API function TerminateProcess() is called to stop the child.Popen.kill()Kills the child. On Posix OSs the function sends SIGKILL to the child. On Windows kill() is an alias for terminate().
附上一个示例:
#程序执行终止时间为当前时刻延迟15秒
stoptime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()+15))
def main():
popen=subprocess.Popen(command,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
pid=popen.pid
print('Popen.pid:'+str(pid))
while True:
line=popen.stdout.readline().strip()
print(line)
thistime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
if thistime&=stoptime:
#终止子进程
popen.terminate()
#等待子进程终止后跳出while循环
if subprocess.Popen.poll(popen) is not None:
print('waiting for subprocess.Popen terminate()')
print('DONE')
if __name__ == '__main__':
四、Python2.x和3.x版本的区别(部分)
Python在2.x和3.x之间有一些特性区别比较大,由于我本地是安装的最新的3.2.2版本,而服务器上还是2.6.x,所以在编写调试时遇到了一些,也拿出来说说说:
区别1.print函数
在python 2.x版本中,同时支持print(xxx)和print xxx,示例:
&&& name='chenzhou'
&&& print name
&&& print(name)
在python 3.x版本中,只支持print(xxx)的方式,示例:
&&& name='chenzhou'
&&& print(name)
&&& print name
SyntaxError: invalid syntax
区别2.判断字典中的key是否存在
在python 2.x中,可以使用has_key(key)函数,也可以判断 key in xxxMap.keys(),示例:
&&& users={'name':'chenzhou','age':'24','address':'Beijing'}
&&& print users.has_key('name')
&&& print 'name' in users.keys()
&&& print users.has_key('score')
&&& print 'score' not in users.keys()
在python 3.x中,只支持key in xxxMap.keys() 示例:
&&& users={'name':'chenzhou','age':'24','address':'Beijing'}
&&& print('name' in users.keys())
&&& print('score' in users.keys())
&&& print(users.has_key('name'))
Traceback (most recent call last):
File "&pyshell#20&", line 1, in &module&
print(users.has_key('name'))
AttributeError: 'dict' object has no attribute 'has_key'
五、Python UnicodeDecodeError
脚本写完后在linux下执行时报错:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 0: ordinal not in range(128)
网友给出的原因是windows系统下编辑的文件在linux下编码转换出现的问题,具体解决方法如下:
#引入sys模块
import sys
#加入下面两行代码
reload(sys)
sys.setdefaultencoding('utf-8')
在grep关键字时用到了正则表达式,推荐一篇关于Python正则表达式的好博客:
Python官网:
以上就是我第一次使用Python的经历,开始体会到了Python的优势。另外,也应了那句俗话,学习编程语言,光看书是没有效果的,只有理论与实践结合起来才能达到学习的效果,我想这应该就是别人经常提到的应用驱动学习吧。
最后,说明一下,我只是一个Python小菜鸟,写的东西很简单,大家不喜勿喷哈。
浏览 28746
chenzhou123520
浏览: 2812595 次
来自: 北京
update t_goods set status=2 whe ...
问下大神,我想做版本控制,但是为了数据一致性,我想2个修改过来 ...
这算是mybatis的奇巧淫技吗?哈哈哈
虽然已经找到 原因了,但是楼主写的还是很清楚 的
关于主键和索引采用行锁还是表锁,与条件是否等值查询没有绝对关系 ...用户名:zhzhgo
文章数:47
访问量:16517
注册日期:
阅读量:1297
阅读量:3317
阅读量:580519
阅读量:462000
51CTO推荐博文
Page Object是一种程序设计模式,将面向过程转变为面向对象(页面对象),将测试对象及单个的测试步骤封装在每个Page对象中,以page为单位进行管理。可以使代码复用,降低维护成本,提高程序可读性和编写效率。#用page&object思想实现百度首页的搜索和登陆功能
from&selenium&import&webdriver
from&mon.keys&import&Keys
import&time
class&BaiduPage():
&&&&url='/'
&&&&username='XXXXXX'
&&&&password='******'
&&&&def&__init__(self,driver):
&&&&&&&&self.driver=driver&&
&&&&&&&&&&&&&&
&&&&def&search(self,kw='51cto'):
&&&&&&&&self.driver.get(self.url)
&&&&&&&&time.sleep(2)
&&&&&&&&self.driver.find_element_by_id('kw').send_keys(kw)
&&&&&&&&self.driver.find_element_by_id('su').click()
&&&&&&&&time.sleep(2)
&&&&def&login(self,username=None,password=None):
&&&&&&&&if&username==None:
&&&&&&&&&&&&username=self.username
&&&&&&&&if&password==None:
&&&&&&&&&&&&password=self.password
&&&&&&&&self.driver.get(self.url)
&&&&&&&&time.sleep(2)
&&&&&&&&self.driver.find_element_by_link_text('登录'.decode('utf-8')).click()
&&&&&&&&time.sleep(2)
&&&&&&&&self.driver.find_element_by_id('TANGRAM__PSP_8__userName').send_keys(self.username)
&&&&&&&&self.driver.find_element_by_id('TANGRAM__PSP_8__password').send_keys(self.password)
&&&&&&&&self.driver.find_element_by_id('TANGRAM__PSP_8__submit').click()
&&&&&&&&time.sleep(2)
&&&&def&__del__(self):
&&&&&&&&pass
&&&&&&&&#self.driver.quit()
driver=webdriver.Chrome()
page=BaiduPage(driver)
page.login()
self.driver.quit()本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)Python 必晓知识点-精简实用_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Python 必晓知识点-精简实用
&&Python 必晓知识点-精简实用
你可能喜欢您所在的位置: &
Python 编码解析
时间: 编辑:feesland 来源:本站整理
Python 编码解析
  ASCII&& Unicode;UTF-8&&gbk
    在具体说明 Python 处理编码之前,先来理清 ASCII、Unicode;UTF-8、gbk 究竟是什么?这边仅简单介绍下,具体请百度。
    ASCII:是基于拉丁字母的一套电脑编码系统,是现今最通用的单字节编码系统。ASCII(1~127) 仅可代表英文、数字及一些符号等,如,A 的 ASCII 码为65(十进制)。
    Unicode:为了解决传统的字符编码方案的局限而产生,为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。犹如其本身的英文含义,Unicode是一种所有符号的编码。Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
    UTF-8:是一种针对Unicode的可变长度字符编码,它是Unicode实现的方式之一,是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间,参考如下:
字符ASCIIUnicodeUTF-8
    gbk:GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码。
  Python 3&支持 Unicode
    从 Python 3.0 开始所有的字符串都支持 Unicode,默认保存为UTF-8格式;故无须特殊处理,即可正常 print 中文
      
    但Python 3. 对应 sys 模块无 sys.setdefaultencoding()这个函数,而python 3的代码和包管理上打破了和2.x的兼容,故原2.x的扩展包要适应这种情况来改写。
  Python2 处理 Unicode
    Python2 默认源代码文件是 ASCII 编码,故仅仅使用英文、数字的情况下一切正常,但是若使用了中文等,会报错,如下:
      
    为了解决此问题,需要保存为 UTF-8&格式,通常会在 .py&文件头上加上 &# -*- coding: utf-8 -*-& ,这样,python就会依照utf-8的编码形式解读其中的字符,加上后运行,如下:
      &
    这边,直接 print 中文字符串显示为乱码,这是由于python编码与控制台编码的不一致造成的。Windows下控制台中的编码使用的是gbk,而在代码中使用的utf-8,python按照utf-8编码打印到gbk编码的控制台下自然就会不一致而不能打印出正确的汉字。
    对此,Python2用来存储文本数据的类型为Unicode 对象,它可以用于存储和维护 Unicode 数据,与现有的字符串对象有良好的集成,必要时提供自动转换。在 Python 中创建 Unicode 字符串和创建普通的字符串一样简单,只需在字符串引号前加 u&即可,如上例中的 &u"中文" 。这样处理之后,print&出的中文就不会乱码了。
    在Python 3.x版本中,把'xxx'和u'xxx'统一成Unicode编码,即写不写前缀u都是一样的
  sys.setdefaultencoding()
    Python2,可通过&sys.setdefaultencoding('utf8') 来设置默认encoding方式,注意,一定要增加 reload(sys),原因参考下方引用。
#!/usr/bin/env python
#encoding: utf-8
import sys
#引用sys模块进来,并不是进行sys的第一次加载
reload(sys)
#重新加载sys
sys.setdefaultencoding('utf8')
#调用setdefaultencoding函数
那么为什么要重新加载,而直接引用过来则不能调用该函数呢?因为setdefaultencoding函数在被系统调用后被删除了,所以通过 import引用进来时其实已经没有了,所以必须reload一次sys模块,这样setdefaultencoding才会为可用,才能在代码里修改解 释器当前的字符编码。
在python安装目录的Lib文件夹下,有一个叫site.py的文件,在里面可以找到main() --& setencoding()--&sys.setdefaultencoding(encoding),因为这个site.py每次启动 python解释器时会自动加载,所以main函数每次都会被执行,setdefaultencoding函数一出来就已经被删除了。
热门关键字用户名:ting2junshui
文章数:147
访问量:19213
注册日期:
阅读量:1297
阅读量:3317
阅读量:580519
阅读量:462000
51CTO推荐博文
python数据类型:(按特征划分)数字类型:整形:布尔形、长整型L、标准整形非整形:双精度型、复数、decimal(不是内建类型)序列类型:字符串(str)元组(tuple)列表(list)映像类型:字典(dict)集合类型:可变集合(set)不可变集合(frozenset)&python数据类型(按可变性划分)可哈希的,不可变数据类型:数字类型不可变集合(frozenset)字符串(str)元组(tuple)可变数据类型:字典(dict)列表(list)可变集合(set)python中引号的作用:‘& ‘“& “''' &'''单引号和双引号基本没区别,同样的作用;双引号可以内嵌单引号。三引号作为大段文字的注释。&python的编解码ASCIIUnicodeUTF-8python模块import moduleName:导入一个模块from module import functionName:从一个模块中导入一个方法import moduleName asnewModuleName:把一个模块重新命名&python用户交互:&&&&&&&& 使用内置函数:raw_input(),该函数接收一个字符串。&&&&&&&& input(),该函数接收一个数字类型python流程控制:if … else …splitstriplen()for variable in range(1, 10):while True:breakcontinuepython练习:登录测试账号。&&&&要求:输入用户名密码;认证成功后显示欢迎信息;输错三次后锁定python的基本语法、数据类型、导入模块、流程控制。python文件处理:&&&&&&&& 读文件:代码展示&&&&&&&& f= file(‘filename.txt’, ‘r’)&&&&&&&& forline in f.readlines():&&&&&&&&&&&&&&&&&& line= line.strip(‘\n’).split(‘:’)&&&&&&&&&&&&&&&&&& printline&&&&&&&& 文件处理模式:&&&&&&&&&&&&&&&&&& r:以只读模式打开文件&&&&&&&&&&&&&&&&&& w:以只写模式打开文件&&&&&&&&&&&&&&&&&& a:以追加模式打开文件&&&&&&&&&&&&&&&&&& r+b:以读写模式打开&&&&&&&&&&&&&&&&&& w+b:以写读模式打开&&&&&&&&&&&&&&&&&& a+b:以追加及读模式打开python字符串处理:&&&&&&&& str.find(substring,[start [,end]]) #可指范围查找子串,返回索引值,否则返回-1&&&&&&&& str.rfind(substring,[start [,end]]) #反向查找&&&&&&&& str.index(substring,[start [,end]]) #同find,只是找不到产生valueerror异常&&&&&&&& str.rindex(substring,[start [,end]]) #同上反向查找&&&&&&&& str.count(substring,[start [,end]]) #返回找到子串的个数&&&&&&&&& str.lowercase()&&&&&&&& str.capitalize()首字母大写&&&&&&&& str.lower()转小写&&&&&&&& str.upper()转大写&&&&&&&& str.swapcase()大小写互换&&&&&&&& str.split(str,‘ ‘)将string转list,以空格分割&&&&&&&& str.join(list,’ ’)将list转string,以空格分割&&&&&&&&& len(str)字符串长度&&&&&&&& cmp(“myfriend”, str) 字符串比较。第一个大返回1&&&&&&&& max(‘abcxyz’)寻找字符串中最大的字符&&&&&&&& min(‘abcxyz’)寻找字符串中最小的字符python中的列表:&&&&&&&& list的方法:&&&&&&&& list.append(var)追加元素&&&&&&&& list.insert(index,var)&&&&&&&& list.pop(var)返回最后一个元素,并从list中删除&&&&&&&& list.remove(var)删除第一次出现的该元素&&&&&&&& list.count(var)该元素在列表中出现的个数&&&&&&&& list.index(var)该元素的位置,无则抛异常&&&&&&&& list.extend(list2)追加list2,到list上。合并&&&&&&&& list.sort()排序&&&&&&&& list.reverse()元素顺序反转&&&&&&&&& list[1:]片段操作符,用于子list的提取&&&&&&&& [1,2]+[3,4]为[1,2,3,4]。同extend()&&&&&&&& [2]*4为[2,2,2,2]&&&&&&&&& dellist[1] 删除指定下标的元素&&&&&&&& dellist[1:3] 删除指定下表范围的元素&&&&&&&& list= list1 list是list1的别名,内存地址相同,对list操作就是对list1的操作&&&&&&&& list= list2[:] 生成list2的一个copypython元组:&&&&&&&& tuple:常量数组&&&&&&&& tuple= (‘a’, ‘b’, ‘c’, ‘d’)&&&&&&&& 可以用list的[],:操作符提取元素,就是不能直接修改元素little case:shopping。初始化金钱数,商品种类、价格,选择购买商品,直到钱不够,退出时打印已购买的商品和剩余金额。开发文件替换小程序:使用方法:./pythonFile.py‘source string’& ‘replace string’filename.txt./pythonFile.py‘source string’& ‘replace string’filename.txt& --bak& filename.txt.bakpython字典DICT:&&&&&&&& dict.get(key,0) 同dict[key],多了个没有则返回默认值,0。[]没有则抛出异常&&&&&&&& dict.has_key(key)有该键返回True,否则False&&&&&&&& dict.keys()返回字典键的列表&&&&&&&& dict.values()以列表的形式返回字典中的值,返回值的列表中可包含重复元素&&&&&&&& dict.items()将所有的字典项以列表方式返回,这些列表中的每一项都来自于(键,值),但是项在返回时并没有特殊的顺序&&&&&&&& dict.update(dict2)增加合并字典&&&&&&&& dict.popitem()得到一个pair,并从字典中删除它,已空则抛出异常&&&&&&&& dict.clear()清空字典,同del dict&&&&&&&& dict.copy()拷贝字典&&&&&&&& dictNaNp(dict1,dict2) 比较字典,(优先级为元素个数、键大小、键值大小&&&&&&&& dict1= dict2 给dict2取个dict1的别名&&&&&&&& dict2= dict.copy() 克隆,另一个拷贝python中列表与字典的比较:&&&&&&&& dict:查找和插入的速度极快,不会随着key的增加而速度变慢需要占用大量的内存,内存浪费多。key不可变默认无序list:查找和插入的时间随着元素的增加而增加占用空间小,内存浪费少。通过下标查询有序python&SET集合&&&&&&&& 特点:无序;元素不重复&&&&&&&& 功能:关系测试;去重&&&&&&&&& set集合运算:&&&&&&&&&&&&&&&&&& a= set([1, 2, 3, 4])&&&&&&&&&&&&&&&&&& b= set([3, 4, 5, 6])&&&&&&&&&&&&&&&&&& a& b 求交集a.intersection(b)&&&&&&&&&&&&&&&&&& a| b 求并集 a.union(b)&&&&&&&&&&&&&&&&&& aC b 求差集a.difference(b)&&&&&&&&&&&&&&&&&& a^ b 求对称差集a.symmetric_difference(b)a.issubset(b)& a是b的子集&&&&&&&&&&&&&&&&&& a.issuperset(b)& a是否包含b查询员工信息:模糊查询员工信息,显示匹配的条数,匹配字符串高亮显示。python中目录和python包的区别:就是包下包含一个__init__.py文件,而目录没有。&模块的常用方法:__name____file____doc__&python中的不定参数:参数前面带一个或两个*。def fun(arg)def fun(*args)def fun(**args)&dict = {‘k1’:1, ‘k2’:2}fun(1,2,3,4,)fun(**dict)=fun(k1=’1’, k2=’2’)&元组和集合只有一个星号,字典是两个星号yield关键字:yield的作用:在写多线程的时候,可以用它创建一个线程池。什么时候用,什么时候拿。它是一个生成器,不是一下就给他创建了。它还能保存函数的执行状态。with关键字:&三元运算:result = ‘human if 1&3 else ‘animalresult = animal&Lambda表达式:a = lambda x, y: x+yprint a(4,10)lambda的作用是:声明一个函数,接收参数,返回参数的运算结果。lambda是一个匿名函数。内置函数help()dir()vars()type()import tempreload(temp)id()更多:/wupeiqi/articles/4276448.html&在使用from file import module的时候多次导入不会执行,只执行第一次导入,如果要想再次导入的话,使用reload(module)再次导入模块。&字符串的格式化占位符:str = ‘i am {0}’print s.format(‘alex’)i am alex&&函数的调用:显示调用函数,直接写出该函数。隐式调用函数,Function(arg)&&&&&apply(Function, (arg))&map()函数:遍历每一个序列里面的元素。序列里面的每一个元素当作参数传给第一个function参数。map(function, sequce, [sequce, …..])也可以使用lambda表达式:map(lambda arg:arg+10, li)&&li = [11, 22, 33]filter() 过滤reduce() 累加apply()zip()eval()__import__()都是对序列里面的函数进行操作,然后返回回来。反射就是把你的导入工作当作字符串。反射:用于开发大型程序,随时可以切换数据库的时候。设计模式里面的工厂模式需要用到这个。降低程序的耦合。通过字符串的形式导入模块:(代码)temp = ‘mysqlhelper’model = __import__(temp)model.cont()并以字符串的形式执行函数:(代码)temp = ‘mysqlhelper’func = ‘count’model = __import__(temp)Funciton = getattr(model, func)常用的模块:随机数random:random(m)randint(m, n)randrange(m, n)MD5加密hash = hashlib.md5()hash.update(‘admin’)hash.hexdigest()hash.digest()序列化和json&& 序列化可以把一个对象和一个列表或字典,通过python特有的方式序列化一下,以二进制的方式加密一下。import pickleli = ['alex',11, 22, 'ok', 'sb']printtype(pickle.dumps(li))&dumpsed =pickle.dumps(li)print dumpsedloadsed =pickle.loads(dumpsed)print loadsedprinttype(loadsed)pickle.dump(li,open('temp.pk' , 'w'))printpickle.load(open('temp.pk', 'r'))&import jsonj_str =json.dumps(data)print j_strwithopen(‘file.json’, w’) as fp:& json.dump(data, fp)RE 正则六个函数:compile&& match&& search&&findall&& &group&&groupsmatch:只能从你给的字符串的起始位置去匹配search:在整个字符串,在整个内容里面去匹配group:输出匹配的结果。常用格式:\d匹配数字\w\t次数:&&& * + ? {m} {m,n}time模块三种表示方法:时间戳&& 之后的秒数元组& 包含了:年、日、星期等….time.struct_time格式化的字符串&&
11:11 print time.time()time.mktime(time.localtime())time.gmtime()&& 可加时间戳参数time.localtime()& 可加时间戳参数time.strptime(‘’, ‘%Y-%m-%d’)time.strftime(‘%Y-%m-%d’)&&默认当前时间time.strftime(‘%Y-%m-%d’, time.localtime())&& 默认当前时间time.asctime()time.asctime(time.localtime())time.ctime(time.time())&sys 模块sys.argv& 命令行参数list, 第一个元素是程序本身路径sys.exit(n)& 退出程序, 正常退出时exit(0)sys.version 获取python解释程序的版本信息sys.maxint& 最大的int值sys.maxunicode& 最大的unicode值sys.path& 返回模块的搜索路径,初始化时使用pythonpathsys.platform&& 返回操作系统平台名称sys.stdout.write(‘please:’)val = sys.stdin.readline()[:-1]print valOS 模块os.getcwd()& 获取当前工作目录,即当前python脚本工作的目录路径os.chdir(“dirname”)&&改变当前脚本工作目录;相当于shell下cdos.curdir&& 返回当前目录;(‘.’)os.pardir&&& 获取当前目录的父目录字符串名:(‘..’)os.makedirs(‘dirname1/dirname2’)&& 可生成多曾递归目录os.removedirs(‘dirname1’)&&&若目录为空,则删除,并递归到上一os.mkdir(‘dirname’)&&&生成单级目录,相当于shell中mkdir& dirnameos.rmdir(‘dirname’)&&删除单级空目录,若目录不为空则无法删除,os.listdir(‘dirname’)os.remove()os.rename(“oldname”, “newname”)os.stat(‘path/filename’)os.sepos.linesepos.pathsepos.nameos.system(“bash command”)os.environos.path.abspath(path)os.path.split(path)os.path.dirname(path)os.path.basename(path)os.path.exists(path)os.path.isabs(path)os.path.isfile(path)os.path.isdir(path)os.path.join(path1[,path2…..])os.path.getatime(path)os.path.getmtime(path)&装饰器(示例代码)def foo():& print ‘foo’def foo():& print ‘before dosth’& print ‘foo’& print ‘after’def foo():& print ‘foo’def wrapper(func):& print ‘before’& func()& print ‘after’wrapper(foo)装饰器面向对象编程异常处理断言First.装饰器――也是一个函数,通过这个函数装饰另一个函数。def outer(fun):& def wrapper():fun()&&&&&&&&&return wrapper&&&&&&&@outer&&&&&&&def fun1():&&&&&&&&&print ‘hello’&&&&&&&&&&&&&&&&&& #后面还有无穷个函数。&&&&&&&&&&&&&&&&&& func1()&&&&&&&& @outer相当于@outer=outer(func1)& func1没有括号就代表这个函数,func1()带有括号就代表执行了这个函数,结果不一样的。&&&&&&&& 如果被调用的fun1函数带有参数,该参数放在defwrapper(arg)里面。带有参数的代码:def outer(fun):& def wrapper(arg):fun(arg)&&&&&&&&&return wrapper&&&&&&&@outer&&&&&&&def fun1():&&&&&&&&&print ‘hello’, arg&&&&&&&&&&&&&&&&&& #后面还有无穷个函数。&&&&&&&&&&&&&&&&&& func1(‘alex’)&&&&&&&& 如果func1有返回值的:def outer(fun):& def wrapper(arg):result = fun(arg)return result&&&&&&&&&return wrapper&&&&&&&@outer&&&&&&&def fun1():&&&&&&&&&print ‘hello’, arg&&&&&&&&&&&&&&&&&& & return ‘eric’&&&&&&&&&&&&&&&&&& #后面还有无穷个函数。&&&&&&&&&&&&&&&&&& request= func1(‘alex’)&&&&&&&&&&&&&&&&&& printrequestsecond.&面向对象:类就是一个抽象实例化一个类就是一个对象,对象里面有属性和方法。类里面的__init__方法,就是一个对象的初始化。相当于java中的构造函数。定义一个类:class Person:&&&&&&&& name = ‘这是一个人’def __init__(self, name):&&& self.name = name&&&&&&&&&&&&&&&&&& pp= Person(‘alex’)&&&&&&&&&&&&&&&&&& printpp.name&&&&&&&&&&&&&&&&&& printPerson.name&&&&&&&&&&&&&&&&&& self代表的就是一个实例化对象。就像上面的代码,self就代表的pp这个对象。&&&&&&&&&&&&&&&&&& 定义在类里面的属性,属于类的,不属于对象,直接可以使用使用类名.属性名调用,如:上段代码中的Person.name。&&&&&&&&&&&&&&&&&& 属于类的字段称为静态字段。通过self调用的称为动态字段(比如说:在__init__中调用的字段)。&&&&&&&&&&&&&&&&&& 类不能直接访问对象的属性,对象可以直接访问类的属性。&&&&&&&&&&&&&&&&&& 在一个类中定义静态方法的办法:直接在方法上面添加@staticmethod,去掉方法中的self。因为self代表的是一个对象。&&&&&&&&&&&&&&&&&& 在类中定义的静态方法可以使用类来调用,也可以使用对象来调用。&&&&&&&&&&&&&&&&&& 对象的属性:在类中定义一个方法,在该方法上添加@property, 就把该方法变成了对象的一个属性。访问的方式:对象名.属性名&& pp.property&& 后面没有小括号。&&&&&&&&&&&&&&&&&& 这个静态方法什么时候用:&&&&&&&&&&&&&&&&&& Python中的私有方法和私有字段:都是以双下划线__& 开头的。私有方法也是通过在内部定义一个公有的方法,该公有的方法调用该私有方法,在外部调用该公有的方法间接的访问该私有方法。强制访问私有方法的办法是:对象调用这个类的私有方法。具体是:对象名._类名__私有方法名()。objName._class__privateFunctionName()私有字段在类中定义了私有字段,外部是不能访问的,只能通过在内部定义函数访问这个私有字段,外部调用该函数间接的访问该私有字段。访问私有字段代码:@propertydef Thailand(self):&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& & return self.__Thailand&&&&&& __Thailand是之前定义的一个私有字段。&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& objName.Thailand& 调用该对象的这个方法来访问私有字段。私有字段一般用在不让别人改,但是可以访问的情况下。&&对象的属性的只读和可改写:它们使用的装饰器不一样。 代码:(只读的)@property&&defThailand(self):& return self.__Thailand(可改写的)& 推荐使用私有字段的操作方式:classClassName(object):& def __init__(self, __Thailand)@Thailand.setter&&&&还得让这个类继承objectdef Thailand(self, value):&& &self.__Thailand = value& 把__Thailand这个私有字段改写成了value这个值了&&&&&&&&&&&&&&&&&&&& 析构函数:就是python解释器在销毁对象的时候,我们可以干点啥,就可以写在这个析构函数里面。就是这个__del__&&&&&&&&&&&&&&&&&& __call__方法:就是创建对象的时候,调用类中的__call__方法,在对象中使用对象名加上()即可。&&&&&&&&&&&&&&&&&&&&&&&&&&& classFoo():& &&&&&&&&&&&&&&&&&&&&&& &&def __call__(self):&&&&&&&&&&&&&&&&&&&&&&&&&&& &&& print ‘我就是__call__方法。’&&&&&&&&&&&&&&&&&&&&&&&&&&& f1= Foo()&&&&&&&&&&&&&&&&&&&&&&&&&&& f1()& --à直接调用对象中的__call__方法。 &&&&&&&&&&&&&&&&&&&&&&&&&&& Foo()()的效果就等于 f1=Foo() f1(),这两步&&&&&&&&&&&&&&&&&&& 继承:在创建子类的时候在子类名后面的括号里写上父类的名字,就继承了父类。&&&&&&&&&&&&&&&&&&&&&&&&&&& 方法的重写(override):发生在类的继承中,子类重写父类的方法。&&&&&&&&&&&&&&&&&&&&&&&&&&& 方法的重载(overload):发生在本类中,两个重名的函数,根据参数的不同,而重载&&&&&&&&&&&&&&&&&&&&&&&&&&&& 子类调用父类的构造函数(也就是父类的__init__函数):两种方法:显示调用:Father.__init__(self)隐式调用:super(son,self).__init__()& 此种方法需要申明父类继承自object继承自object的类称为新式类,未继承自object的类称为经典类。&多继承:如果在多继承中,多个父类含有同一函数的话,就从最左边的父类找到该函数并执行。&抽象类:代码如下:&&&&&&&& from abc import ABCMeta, abstractmethod&&&&&&&& class Bar:&&&&&&&&&&&&&&&&&& __metaclass__ = ABCMeta&&&&&&&&&&&&&&&&&& @abctractmethod&&&&&&&&&&&&&&&&&& def fun(self): pass&&&&&&&& class Foo(Bar):&&&&&&&&&&&&&&&&&& def __init__(self):&&&&&&&&&&&&&&&&&&&&&&&&&& print‘__init__’&&&&&&&& Foo()&&&&&&&&&&&&&&&&&&& python中的接口:没明确讲解。Third.python中的异常处理:使用的是try:&&&&&&&& xxxxxxxexcept Exception, e:&&&&&&&& xxxxxxelse:&&&&&&&& print ‘没有出错。’finally:&&&&&&&& print ‘这里的代码无论如何都会执行。’&&&&&&&&&&&&&&&&&& 自定义的异常类:&&&&&&&&&&&&&&&&&& &&&&&&&& class MyException(Exception):&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& def__init(self, msg):&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& self.error= msg&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& def__str__(self, *args, **kwargs):&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& returnself.error&&&&&&&&&&&&&&&&&& 主动触发异常:使用raise关键字&&&&&&&&&&&&&&&&&&&&&&&&&&& raiseMyException(‘自定义错误’)&&&&&&&&&&&&&&&&&& 为什么要主动触发异常:Fourth.断言python中的断言:assert(1 == 1)&python操作mysql数据库socket&python操作mysql数据库。首先使用connect函数连接mysql,使用cursor获一个句柄,使用execute执行一条mysql语句,fetchall获得该数据库里面数据表的所有数据,然后关闭句柄和连接。把sql语句定义为一个字符串变量,把里面的值使用格式化字符串的形式传递一个%s,如:sql = “insert into userinfo values(%s, %s)&& 这里面的占位符只能是%s.params = (‘bababa’, ‘M’)reCount = cur.execute(sql, params)涉及到数据库增删改的时候需要调用commit()方法。mit()&&&&&&&& 完整的代码:&&&&&&&& importMySQLdb&&&&&&&& connect =MySQLdb.connect(host=’localhost’, user=’root’, passwd=’root’, db=’dbname’)&&&&&&&& current =connect.cursor()&&&&&&&& sql = “insertinto tname(col1, col2, …) values(%s, %s, …)”&&&&&&&& params =(‘val1’, ‘val2’)&&&&&&&& reCount =cur.execute(sql, params)&&&&&&&& data =cur.fetchall()& 获取所有数据&&&&&&&& mit()&& 与事务相关&&&&&&&& conn.rollback() 与事务相关&&&&&&&& cur.close()&&&&&&&& connect.close()&&&&&&&& print reCount&&&&&&&& print data&&&&&&&&&&&&&&&&&& 获取mysql的id值的函数:lastrowid&python项目的三层架构思想数据访问层, 业务逻辑层, 应用层。socket编程:使用:异步、多线程、socket&&& 处理多个请求的服务端。SocketServer:把& 异步,多线程& 做了处理。用socketserver和不用socketserver的区别:使用socketserver不会有阻塞,处理多个请求,可以多个客户端连接。不使用socketserver效果相反。在之后的所有socket编程都使用socketserver库。&&&线程进程ftp服务器paramiko库&ftp服务器就是使用socketserver库建立一个ftp服务器数据的传输。&&&&&&&&&&&&&&&& 线程:python中的多线程:&&&&&&&&&&&&&&&&&& 使用threading.Thread模块。常用的方法有:&&&&&&&&&&&&&&&&&&&&&&&&&&& CstartCgetName()CsetName()CisDaemon()CsetDaemon()Cjoin(timeout)主线程启动了子线程后,一直等到子线程执行结束,再执行主线程的其他东西。加了timeout后,就是主线程等到timeout时间后或者子线程执行结束,再执行主线程。Crun()&&&&&&&&&&&&&&&&&& 使这个线程与某件事情建立关系,使用target传递参数。&&&&&&&&&&&&&&&&&& t1= Thread(target=function, args=(1, ))&&&&&&&&&&&&&&&&&&&& target=function,这个是传递的某个方法,args=(1,))& args是传递该方法中的参数, 参数传递完毕后需要接一个逗号,&&&&&&&&&&&&&&&&&&&& 代码示例:&&&&&&&&&&&&&&&&&&&&&&&&&&& defFoo(arg, v):&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& foritem in range(100):&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& printitem&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& time.sleep(1)&&&&&&&&&&&&&&&&&&&&&&&&&&& print‘before’&&&&&&&&&&&&&&&&&&&&&&&&&&& t1= Thread(target=Foo, args=(‘ddfdfdffd’,11, ))&&&&&&&&&&&&&&&&&&&&&&&&&&& t1.setDaemon(True)&&&&&&&&&&&&&&&&&&&&&&&&&&& t1.start()&&&&&&&&&&&&&&&&&& 自建线程类:新建类继承Thread&&&&&&&&&&&&&&&&&&&&&&&&&&& classMyThread(Thread):&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& defrun(self):&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& print‘I am a thread.’&&&&&&&&&&&&&&&&&& 执行线程,其实就是调用了Thread类中的run方法。&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 线程安全的问题,使用锁的功能:线程锁,能很好的保护线程安全。&&&&&&&&&&&&&&&&&& 线程安全:队列&&&&&&&&&&&&&&&&&&&&&&&&&&&& 队列:先进先出&&&&&&&&&&&&&&&&&&&&&&&&&&& 线程栈:后进先出&&&&&&&&&&&&&&&&&& 多线程的使用:python不是一个线程安全语言,需要自己控制。生产者消费者模型:& &&&&生产者生产一个放到队列或者栈里面,然后消费者从队列或栈里面取一个。&线程安全的问题:&&& 使用线程锁lock = threading.Lock()定义一个锁lock.acquire()获取锁 给需要加锁的代码加锁。加锁的代码执行完后要释放锁:lock.release()python中防止死锁:定义锁的时候使用递归锁。lock = threading.Rlock()信号量:同时执行的线程几个。samp = threading.BoundedSemaphore(n)异步:&&&paramiko模块的使用:sshlinux主机批量管理。&ssh的rsa原理:使用非对称加密。&&&&&&&& 公钥:在服务器端做加密。&&&&&&&& 私钥:在客户端做解密。多进程Paramiko审计开发select异步模型&&&&&&&&& 进程:使用multiprocessing模块的Pool类。&&&&&&&&&&&&&&&&&& 多进程多线程可以绕过GlobalInterpreter Lock(全局解释器锁)&&&&&&&& 多进程示例代码:&&&&&&&&&&&&&&&&&& frommultiprocessing import Pool&&&&&&&&&&&&&&&&&& deff(x):&&&&&&&&&&&&&&&&&&&&&&&&&&& returnx*x&&&&&&&&&&&&&&&&&& if__name__ == ‘__main__’:&&&&&&&&&&&&&&&&&&&&&&&&&&& p= Pool(5)&&&&&&&&&&&&&&&&&&&&&&&&&&& print(p.map(f,[1,2,3]))&&&&&&&&&&&&&&&&&&&& 创建多个子进程的方法2,示例代码:&&&&&&&&&&&&&&&&&&&&&&&&&&& frommultiprocessing import Process&&&&&&&&&&&&&&&&&&&&&&&&&&& importos&&&&&&&&&&&&&&&&&&&&&&&&&&& definfo(title):&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ifhasattr(os, ‘getppid’):&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& print‘parent process:’, os.getppid()&&&&&&&&&&&&&&&&&&&&&&&&&&& print‘process id:’, os.getpid()&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& if__name__ == ‘__main__’:&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& info(‘mainline’)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& p= Process(target = f, args = (‘bbbbb’, ))&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& p.start()&&&&&&&&&&&&&&&&&& &&&&&&&&&&&&&&&&&& p.join()&&&&&&&&& 进程间通信:使用队列。&&&&&&&&&&&&&&&&&& frommultiprocessing import Process,Queue&&&&&&&&& 进程间同步:加上锁,使用Manager()方法。也可以使用Value和Array&&&&&&&&& 进程池:通过Pool创建多进程。&&&&&&&&& python异步:select&& vs&& poll&epoll&& 异步IO&&&&&&&&& 审计工具:web工具:shellinabox&&&&&&&&&&&第8天的主要内容:实战练习:python开发一个类似nagios的监控软件。&&&&&&&&&&&&&&&&&&&&&&&&&&& python的 socket 开源框架:twistedmatrix& & & & &主题:使用PYTHON开发类Nagios监控软件知识点:1.使用Reids发布\订阅功能做服务器和客户端的通信通道2.利用面向对象思想开发监控模板3.实现监控项目插件化,允许用户自行开发监控插件&&&需求: 1.每个客户端需要监控的服务不同2.每个服务的监控间隔不同3.允许模板的形式批量修改监控指标4.不同设备的监控阀值不同 5.可自定最近n分钟内hit\max\avg\last\... 指标超过阈值6.报警策略、报警等级、报警自动升级7.历史数据的存储和优化8.跨机房、区域代理服务器 &00 总指标,没5分钟一次,1hour = 24W1day = 576W *4Byte、Cpu :iowait 20& idle 80 system 30 user 50& &&What the client side has to know before itcan invoke a plugin?Answer: plugin_name \ interval \service name &&&&&&&&&&&&python web框架 Django&&&&&&&& Controller:该模型里面存放的是一组对业务逻辑的描述代码。&&&&&&&& Model:该模型里面存放的是一组对数据库进行操作的代码。&&&&&&&& View:该模型里面存放的是一组html文件。&/wupeiqi/articles/4491246.html&创建django程序,使用IDE创建一个django application,并配置运行参数。&&&&&&&&&
了这篇文章
类别:┆阅读(0)┆评论(0)

我要回帖

更多关于 python object对象 的文章

 

随机推荐