码迷,mamicode.com
首页 > 编程语言 > 详细

python实例手册

时间:2015-07-16 15:42:15      阅读:645      评论:0      收藏:0      [点我收藏+]

标签:

python实例手册

 

#encoding:utf8

设定编码-支持中文

 

0说明

 

手册制作雪松 littlepy

更新日期: 2013-12-19

欢迎系统运维加入Q: 198173206  # 加群请回答问题

 

请使用"notepad++"打开此文档,"alt+0"将函数折叠后方便查阅

请勿删除信息,转载请说明出处,抵制不道德行为。

错误在所难免,还望指正!

 

# python实例手册下载地址:

http://hi.baidu.com/quanzhou722/item/cf4471f8e23d3149932af2a7

 

# shell实例手册最新下载地址:

http://hi.baidu.com/quanzhou722/item/f4a4f3c9eb37f02d46d5c0d9

 

# LazyManage运维批量管理软件下载[shell]:

http://hi.baidu.com/quanzhou722/item/4ccf7e88a877eaccef083d1a

 

# LazyManage运维批量管理软件下载[python]:

http://hi.baidu.com/quanzhou722/item/4213db3626a949fe96f88d3c

 

基础

 

查看帮助

import os

for i in dir(os):

print i         # 模块的方法

help(os.path)       # 方法的帮助

 

pip模块安装

 

yum install python-pip            # centos安装pip

sudo apt-get install python-pip   # ubuntu安装pip

pip官方安装脚本

wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py

python get-pip.py

加载环境变量

vim /etc/profile

export PATH=/usr/local/python27/bin:$PATH

. /etc/profile

 

pip install Package             # 安装包 pip install requests

pip show --files Package        # 查看安装包时安装了哪些文件

pip show --files Package        # 查看哪些包有更新

pip install --upgrade Package   # 更新一个软件包

pip uninstall Package           # 卸载软件包

 

变量

 

r=r‘\n‘          # 输出时原型打印

u=u‘中文‘        # 定义为unicode编码

global x         # 全局变量

a = 0 or 2 or 1  # 布尔运算赋值,a值为True既不处理后面,a值为2.  None、字符串‘‘、空元组()、空列表[],空字典{}0、空字符串都是false

name = raw_input("input:").strip()        # 输入字符串变量

num = int(raw_input("input:").strip())    # 输入字符串str转为int

locals()                                  # 所有局部变量组成的字典

locals().values()                         # 所有局部变量值的列表

os.popen("date -d @{0} +‘%Y-%m-%d %H:%M:%S‘".format(12)).read()    # 特殊情况引用变量 {0} 代表第一个参数

 

打印

 

字符串 %s  整数 %d  浮点 %f  原样打印 %r

print ‘字符串: %s 整数: %d 浮点: %f 原样打印: %r‘ % (‘aa‘,2,1.0,‘r‘)

print ‘abc‘,      # 有逗号,代表不换行打印,在次打印会接着本行打印

 

列表

列表元素的个数最多 536870912

shoplist = [‘apple‘, ‘mango‘, ‘carrot‘, ‘banana‘]

shoplist[2] = ‘aa‘

del shoplist[0]

shoplist.insert(‘4‘,‘www‘)

shoplist.append(‘aaa‘)

shoplist[::-1]    # 倒着打印 对字符翻转串有效

shoplist[2::3]    # 从第二个开始每隔三个打印

‘\t‘.join(li)     # 将列表转换成字符串

list(set([‘qwe‘, ‘as‘, ‘123‘, ‘123‘]))   # 将列表通过集合去重复

 

元组

 

不可变

zoo = (‘wolf‘, ‘elephant‘, ‘penguin‘)

 

字典

 

ab = {       ‘Swaroop‘   : ‘swaroopch@byteofpython.info‘,

 ‘Larry‘     : ‘larry@wall.org‘,

 }

ab[‘c‘] = 80      # 添加字典元素

del ab[‘Larry‘]   # 删除字典元素

ab.keys()         # 查看所有键值

ab.values()       # 打印所有值

ab.has_key(‘a‘)   # 查看键值是否存在

ab.items()        # 返回整个字典列表

 

流程结构

 

if判断

 

布尔值操作符 and or not 实现多重判断

if a == b:

print ‘==‘

elif a < b:

print b

else:

print a

fi

 

while循环

 

while True:

if a == b:

print "=="

break

print "!="

else:

print ‘over‘

 

count=0

while(count<9):

print count

count += 1

 

for循环

 

sorted()           # 返回一个序列(列表)

zip()              # 返回一个序列(列表)

enumerate()        # 返回迭代器(类似序列)

reversed()         # 反序迭代器对象

dict.iterkeys()    # 通过键迭代

dict.itervalues()  # 通过值迭代

dict.iteritems()   # 通过键-值对迭代

randline()         # 文件迭代

iter(obj)          # 得到obj迭代器 检查obj是不是一个序列

iter(a,b)          # 重复调用a,直到迭代器的下一个值等于b

for i in range(1, 5):

print i

else:

print ‘over‘

 

list = [‘a‘,‘b‘,‘c‘,‘b‘]

for i in range(len(list)):

print list[i]

for x, Lee in enumerate(list):

print "%d %s Lee" % (x+1,Lee)

 

流程结构简写

 

[ i * 2 for i in [8,-2,5]]

[16,-4,10]

[ i for i in range(8) if i %2 == 0 ]

[0,2,4,6]

 

tab补全

 

# vim /usr/lib/python2.7/dist-packages/tab.py

# python startup file

import sys

import readline

import rlcompleter

import atexit

import os

# tab completion

readline.parse_and_bind(‘tab: complete‘)

# history file

histfile = os.path.join(os.environ[‘HOME‘], ‘.pythonhistory‘)

 

函数

 

def printMax(a, b = 1):

if a > b:

print a

return a

else:

print b

return b

x = 5

y = 7

printMax(x, y)

 

模块

 

# Filename: mymodule.py

def sayhi():

print ‘mymodule‘

version = ‘0.1‘

 

导入模块

import mymodule

from mymodule import sayhi, version

使用模块中函数

mymodule.sayhi()

 

取参数

 

import sys

for i in sys.argv:

print i

 

对象的方法

 

class Person:

实例化初始化的方法

def __init__(self, name ,age):

self.name = name

self.age = age

print self.name

self此函数为方法

def sayHi(self):

print ‘Hello, my name is‘, self.name

#对象消逝的时候被调用

def __del__(self):

print ‘over‘

实例化对象

p = Person(‘Swaroop‘)

使用对象方法

p.sayHi()

继承

class Teacher(Person):

def __init__(self, name, age, salary):

Person.__init__(self, name, age)

self.salary = salary

print ‘(Initialized Teacher: %s)‘ % self.name

def tell(self):

Person.tell(self)

print ‘Salary: "%d"‘ % self.salary

t = Teacher(‘Mrs. Shrividya‘, 40, 30000)

 

文件处理

 

模式‘r‘  ‘w‘ 追加‘a‘ 读写‘r+‘ 二进制文件‘b‘  ‘rb‘,‘wb‘,‘rb+‘

 

写文件

f = file(‘poem.txt‘, ‘w‘) 

f.write("string")

f.write(str(i))

f.flush()

f.close() 

 

读文件

f = file(‘/etc/passwd‘,‘r‘)

while True:

line = f.readline()    # 返回一行

if len(line) == 0:

break

x = line.split(":")                  # 冒号分割定义序列

#x = [ x for x in line.split(":") ]  # 冒号分割定义序列

#x = [ x.split("/") for x in line.split(":") ]  # 先冒号分割,/分割 打印x[6][1]

print x[6],"\n",

f.close() 

 

读文件2

f = file(‘/etc/passwd‘)

c = f.readlines()       # 读入所有文件内容,可反复读取,大文件时占用内存较大

for line in c:

print line.rstrip(),

f.close()

 

读文件3

for i in open(‘b.txt‘):   # 直接读取也可迭代,并有利于大文件读取,但不可反复读取

print i,

 

追加日志

log = open(‘/home/peterli/xuesong‘,‘a‘)

print >> log,‘faaa‘

log.close()

 

with读文件

with open(‘a.txt‘) as f:

# print f.read()        # 打印所有内容为字符串

print f.readlines()     # 打印所有内容按行分割的列表

 

csv读配置文件  

192.168.1.5,web # 配置文件按逗号分割

list = csv.reader(file(‘a.txt‘))

for line in list:

print line              #  [‘192.168.1.5‘, ‘web‘]

 

触发异常

 

class ShortInputException(Exception):

‘‘‘A user-defined exception class.‘‘‘

def __init__(self, length, atleast):

Exception.__init__(self)

self.length = length

self.atleast = atleast

try:

s = raw_input(‘Enter something --> ‘)

if len(s) < 3:

raise ShortInputException(len(s), 3)

except EOFError:

print ‘\nWhy did you do an EOF on me?‘

except ShortInputException, x:

print ‘ShortInputException: The input was of length %d, \

  was expecting at least %d‘ % (x.length, x.atleast)

else:

print ‘No exception was raised.‘ 

 

内建函数

 

dir(sys)            # 显示对象的属性

help(sys)           # 交互式帮助

int(obj)            # 转型为整形

str(obj)            # 转为字符串

len(obj)            # 返回对象或序列长度

open(file,mode)     # 打开文件 #mode (r ,w , a追加)

range(0,3)          # 返回一个整形列表

raw_input("str:")   # 等待用户输入

type(obj)           # 返回对象类型

abs(-22)            # 绝对值

random              # 随机数

random.randrange(9) # 9以内随机数

choice()            # 随机返回给定序列的一个元素

divmod(x,y)         # 函数完成除法运算,返回商和余数。

isinstance(object,int)    # 测试对象类型 int 

round(x[,n])        # 函数返回浮点数x的四舍五入值,如给出n值,则代表舍入到小数点后的位数

xrange()            # 函数与range()类似,但xrnage()并不创建列表,而是返回一个xrange对象

xrange([lower,]stop[,step])

strip()             # 是去掉字符串两端多于空格,该句是去除序列中的所有字串两端多余的空格

del                 # 删除列表里面的数据

cmp(x,y)            # 比较两个对象    #根据比较结果返回一个整数,如果x<y,则返回-1;如果x>y,则返回1,如果x==y则返回0

max()               # 字符串中最大的字符

min()               # 字符串中最小的字符

sorted()            # 对序列排序

reversed()          # 对序列倒序

enumerate()         # 返回索引位置和对应的值

sum()               # 总和

list()              # 变成列表可用于迭代

tuple()             # 变成元组可用于迭代   #一旦初始化便不能更改的数据结构,速度比list

zip()               # 返回一个列表

>>> s = [‘11‘,‘22‘,‘33‘]

>>> t = [‘aa‘,‘bb‘,‘cc‘]

>>> zip(s,t)

[(‘11‘, ‘aa‘), (‘22‘, ‘bb‘), (‘33‘, ‘cc‘)]

 

字符串相关模块

 

string         # 字符串操作相关函数和工具

re             # 正则表达式

struct         # 字符串和二进制之间的转换

c/StringIO     # 字符串缓冲对象,操作方法类似于file对象

base64         # Base16\32\64数据编解码

codecs         # 解码器注册和基类

crypt          # 进行单方面加密

difflib        # 找出序列间的不同

hashlib        # 多种不同安全哈希算法和信息摘要算法的API

hma            # HMAC信息鉴权算法的python实现

md5            # RSAMD5信息摘要鉴权

rotor          # 提供多平台的加解密服务

sha            # NIAT的安全哈希算法SHA

stringprep     # 提供用于IP协议的Unicode字符串

textwrap       # 文本包装和填充

unicodedate    # unicode数据库

 

列表类型内建函数

 

list.append(obj)                 # 向列表中添加一个对象obj

list.count(obj)                  # 返回一个对象obj在列表中出现的次数

list.extend(seq)                 # 把序列seq的内容添加到列表中

list.index(obj,i=0,j=len(list))  # 返回list[k] == obj k,并且k的范围在i<=k<j;否则异常

list.insert(index.obj)           # 在索引量为index的位置插入对象obj

list.pop(index=-1)               # 删除并返回指定位置的对象,默认是最后一个对象

list.remove(obj)                 # 从列表中删除对象obj

list.reverse()                   # 原地翻转列表

list.sort(func=None,key=None,reverse=False)  # 以指定的方式排序列表中成员,如果funckey参数指定,则按照指定的方式比较各个元素,如果reverse标志被置为True,则列表以反序排列

 

序列类型操作符

 

seq[ind]              # 获取下标为ind的元素

seq[ind1:ind2]        # 获得下标从ind1ind2的元素集合

seq * expr            # 序列重复expr

seq1 + seq2           # 连接seq1seq2

obj in seq            # 判断obj元素是否包含在seq

obj not in seq        # 判断obj元素是否不包含在seq

 

字符串类型内建方法

 

string.expandtabs(tabsize=8)                  # tab符号转为空格 #默认8个空格

string.endswith(obj,beg=0,end=len(staring))   # 检测字符串是否已obj结束,如果是返回True #如果begend指定检测范围是否已obj结束

string.count(str,beg=0,end=len(string))       # 检测strstring里出现次数

string.find(str,beg=0,end=len(string))        # 检测str是否包含在string

string.index(str,beg=0,end=len(string))       # 检测str不在string,会报异常

string.isalnum()                              # 如果string至少有一个字符并且所有字符都是字母或数字则返回True

string.isalpha()                              # 如果string至少有一个字符并且所有字符都是字母则返回True

string.isnumeric()                            # 如果string只包含数字字符,则返回True

string.isspace()                              # 如果string包含空格则返回True

string.isupper()                              # 字符串都是大写返回True

string.islower()                              # 字符串都是小写返回True

string.lower()                                # 转换字符串中所有大写为小写

string.upper()                                # 转换字符串中所有小写为大写

string.lstrip()                               # 去掉string左边的空格

string.rstrip()                               # 去掉string字符末尾的空格

string.replace(str1,str2,num=string.count(str1))  # string中的str1替换成str2,如果num指定,则替换不超过num

string.startswith(obj,beg=0,end=len(string))  # 检测字符串是否以obj开头

string.zfill(width)                           # 返回字符长度为width的字符,原字符串右对齐,前面填充0

string.isdigit()                              # 只包含数字返回True

string.split("分隔符")                        # string切片成一个列表

":".join(string.split())                      # :作为分隔符,将所有元素合并为一个新的字符串

 

序列类型相关的模块

 

array         # 一种受限制的可变序列类型,元素必须相同类型

copy          # 提供浅拷贝和深拷贝的能力

operator      # 包含函数调用形式的序列操作符 operator.concat(m,n)

re            # perl风格的正则表达式查找

StringIO      # 把长字符串作为文件来操作 如: read() \ seek()

cStringIO     # 把长字符串作为文件来操,作速度更快,但不能被继承

textwrap      # 用作包装/填充文本的函数,也有一个类

types         # 包含python支持的所有类型

collections   # 高性能容器数据类型

 

字典内建方法

 

dict.clear()                            # 删除字典中所有元素

dict copy()                             # 返回字典(浅复制)的一个副本

dict.fromkeys(seq,val=None)             # 创建并返回一个新字典,seq中的元素做该字典的键,val做该字典中所有键对的初始值

dict.get(key,default=None)              # 对字典dict中的键key,返回它对应的值value,如果字典中不存在此键,则返回default

dict.has_key(key)                       # 如果键在字典中存在,则返回True innot in代替

dicr.items()                            # 返回一个包含字典中键、值对元组的列表

dict.keys()                             # 返回一个包含字典中键的列表

dict.iter()                             # 方法iteritems()iterkeys()itervalues()与它们对应的非迭代方法一样,不同的是它们返回一个迭代子,而不是一个列表

dict.pop(key[,default])                 # 和方法get()相似.如果字典中key键存在,删除并返回dict[key]

dict.setdefault(key,default=None)       # set()相似,但如果字典中不存在key,dict[key]=default为它赋值

dict.update(dict2)                      # 将字典dict2的键值对添加到字典dict

dict.values()                           # 返回一个包含字典中所有值得列表

 

dict([container])     # 创建字典的工厂函数。提供容器类(container),就用其中的条目填充字典

len(mapping)          # 返回映射的长度(-值对的个数)

hash(obj)             # 返回obj哈希值,判断某个对象是否可做一个字典的键值

 

集合方法

 

s.update(t)                         # t中的元素修改s,s现在包含st的成员   s |= t

s.intersection_update(t)            # s中的成员是共用属于st的元素          s &= t

s.difference_update(t)              # s中的成员是属于s但不包含在t中的元素    s -= t

s.symmetric_difference_update(t)    # s中的成员更新为那些包含在st,但不是st共有的元素  s ^= t

s.add(obj)                          # 在集合s中添加对象obj

s.remove(obj)                       # 从集合s中删除对象obj;如果obj不是集合s中的元素(obj not in s),将引发KeyError错误

s.discard(obj)                      # 如果obj是集合s中的元素,从集合s中删除对象obj

s.pop()                             # 删除集合s中的任意一个对象,并返回它

s.clear()                           # 删除集合s中的所有元素

s.issubset(t)                       # 如果st的子集,则返回True   s <= t

s.issuperset(t)                     # 如果ts的超集,则返回True   s >= t

s.union(t)                          # 合并操作;返回一个新集合,该集合是st的并集   s | t

s.intersection(t)                   # 交集操作;返回一个新集合,该集合是st的交集   s & t

s.difference(t)                     # 返回一个新集合,改集合是s的成员,但不是t的成员  s - t

s.symmetric_difference(t)           # 返回一个新集合,该集合是st的成员,但不是st共有的成员   s ^ t

s.copy()                            # 返回一个新集合,它是集合s的浅复制

obj in s                            # 成员测试;objs中的元素 返回True

obj not in s                        # 非成员测试:obj不是s中元素 返回True

s == t                              # 等价测试 是否具有相同元素

s != t                              # 不等价测试 

s < t                               # 子集测试;s!=ts中所有元素都是t的成员

s > t                               # 超集测试;s!=tt中所有元素都是s的成员

 

序列化

 

#!/usr/bin/python

import cPickle

obj = {‘1‘:[‘4124‘,‘1241‘,‘124‘],‘2‘:[‘12412‘,‘142‘,‘1241‘]}

 

pkl_file = open(‘account.pkl‘,‘wb‘)

cPickle.down(obj,pkl_file)

pkl_file.close()

 

pkl_file = open(‘account.pkl‘,‘rb‘)

account_list = cPickle.load(pkl_file)

pkl_file.close()

 

文件对象方法

 

file.close()                     # 关闭文件

file.fileno()                    # 返回文件的描述符

file.flush()                     # 刷新文件的内部缓冲区

file.isatty()                    # 判断file是否是一个类tty设备

file.next()                      # 返回文件的下一行,或在没有其他行时引发StopIteration异常

file.read(size=-1)               # 从文件读取size个字节,当未给定size或给定负值的时候,读取剩余的所有字节,然后作为字符串返回

file.readline(size=-1)           # 从文件中读取并返回一行(包括行结束符),或返回最大size个字符

file.readlines(sizhint=0)        # 读取文件的所有行作为一个列表返回

file.xreadlines()                # 用于迭代,可替换readlines()的一个更高效的方法

file.seek(off, whence=0)         # 在文件中移动文件指针,whence(0代表文件起始,1代表当前位置,2代表文件末尾)偏移off字节

file.tell()                      # 返回当前在文件中的位置

file.truncate(size=file.tell())  # 截取文件到最大size字节,默认为当前文件位置

file.write(str)                  # 向文件写入字符串

file.writelines(seq)             # 向文件写入字符串序列seq;seq应该是一个返回字符串的可迭代对象

 

文件对象的属性

 

file.closed          # 表示文件已被关闭,否则为False

file.encoding        # 文件所使用的编码  当unicode字符串被写入数据时,它将自动使用file.encoding转换为字节字符串;file.encodingNone时使用系统默认编码

file.mode            # Access文件打开时使用的访问模式

file.name            # 文件名

file.newlines        # 未读取到行分隔符时为None,只有一种行分隔符时为一个字符串,当文件有多种类型的行结束符时,则为一个包含所有当前所遇到的行结束符的列表

file.softspace       # 0表示在输出一数据后,要加上一个空格符,1表示不加

 

异常

 

NameError:              # 尝试访问一个未申明的变量

ZeroDivisionError:      # 除数为零

SyntaxErrot:            # 解释器语法错误

IndexError:             # 请求的索引元素超出序列范围

KeyError:               # 请求一个不存在的字典关键字

IOError:                # 输入/输出错误

AttributeError:         # 尝试访问未知的对象属性

ImportError             # 没有模块

IndentationError        # 语法缩进错误

KeyboardInterrupt       # ctrl+C

SyntaxError             # 代码语法错误

ValueError              # 值错误

TypeError               # 传入对象类型与要求不符合

 

触发异常

 

raise exclass            # 触发异常,exclass生成一个实例(不含任何异常参数)

raise exclass()          # 触发异常,但现在不是类;通过函数调用操作符(function calloperator:"()")作用于类名生成一个新的exclass实例,同样也没有异常参数

raise exclass, args      # 触发异常,但同时提供的异常参数args,可以是一个参数也可以是元组

raise exclass(args)      # 触发异常,同上

raise exclass, args, tb  # 触发异常,但提供一个跟踪记录(traceback)对象tb供使用

raise exclass,instance   # 通过实例触发异常(通常是exclass的实例)

raise instance           # 通过实例触发异常;异常类型是实例的类型:等价于raise instance.__class__, instance

raise string             # 触发字符串异常

raise string, srgs       # 触发字符串异常,但触发伴随着args

raise string,args,tb     # 触发字符串异常,但提供一个跟踪记录(traceback)对象tb供使用

raise                    # 重新触发前一个异常,如果之前没有异常,触发TypeError

 

内建异常

 

BaseException                # 所有异常的基类

SystemExit                   # python解释器请求退出

KeyboardInterrupt            # 用户中断执行

Exception                    # 常规错误的基类

StopIteration                # 迭代器没有更多的值

GeneratorExit                # 生成器发生异常来通知退出

SystemExit                   # python解释器请求退出

StandardError                # 所有的内建标准异常的基类

ArithmeticError              # 所有数值计算错误的基类

FloatingPointError           # 浮点计算错误

OverflowError                # 数值运算超出最大限制

AssertionError               # 断言语句失败

AttributeError               # 对象没有这个属性

EOFError                     # 没有内建输入,到达EOF标记

EnvironmentError             # 操作系统错误的基类

IOError                      # 输入/输出操作失败

OSError                      # 操作系统错误

WindowsError                 # windows系统调用失败

ImportError                  # 导入模块/对象失败

KeyboardInterrupt            # 用户中断执行(通常是ctrl+c)

LookupError                  # 无效数据查询的基类

IndexError                   # 序列中没有此索引(index)

KeyError                     # 映射中没有这个键

MemoryError                  # 内存溢出错误(对于python解释器不是致命的)

NameError                    # 未声明/初始化对象(没有属性)

UnboundLocalError            # 访问未初始化的本地变量

ReferenceError               # 若引用试图访问已经垃圾回收了的对象

RuntimeError                 # 一般的运行时错误

NotImplementedError          # 尚未实现的方法

SyntaxError                  # python语法错误

IndentationError             # 缩进错误

TabError                     # tab和空格混用

SystemError                  # 一般的解释器系统错误

TypeError                    # 对类型无效的操作

ValueError                   # 传入无效的参数

UnicodeError                 # Unicode相关的错误

UnicodeDecodeError           # Unicode解码时的错误

UnicodeEncodeError           # Unicode编码时的错误

UnicodeTranslateError        # Unicode转换时错误

Warning                      # 警告的基类

DeprecationWarning           # 关于被弃用的特征的警告

FutureWarning                # 关于构造将来语义会有改变的警告

OverflowWarning              # 旧的关于自动提升为长整形的警告

PendingDeprecationWarning    # 关于特性将会被废弃的警告

RuntimeWarning               # 可疑的运行时行为的警告

SyntaxWarning                # 可疑的语法的警告

UserWarning                  # 用户代码生成的警告

 

class MyException(Exception):   # 继承Exception异常的类,定义自己的异常

pass

try:                          # 监控这里的异常

option=int(raw_input(‘my age:‘))

if option != 28:

raise MyException,‘a1‘  #触发异常

except MyException,a:         # 异常处理代码

print ‘MyExceptionaa‘

print a    # 打印异常处内容

except:            # 捕捉所有其它错误

print ‘except‘

finally:           # 无论什么情况都会执行 关闭文件或断开连接等

   print ‘finally‘ 

else:              # 无任何异常 无法和finally同用

print ‘no Exception‘

 

函数式编程的内建函数

 

apply(func[,nkw][,kw])          # 用可选的参数来调用func,nkw为非关键字参数,kw为关键字参数;返回值是函数调用的返回值

filter(func,seq)                # 调用一个布尔函数func来迭代遍历每个seq中的元素;返回一个使func返回值为true的元素的序列

map(func,seq1[,seq2])           # 将函数func作用于给定序列(s)的每个元素,并用一个列表来提供返回值;如果funcNone,func表现为一个身份函数,返回一个含有每个序列中元素集合的n个元组的列表

reduce(func,seq[,init])         # 将二元函数作用于seq序列的元素,每次携带一堆(先前的结果以及下一个序列元素),连续地将现有的结果和下一个值作用在获得的随后的结果上,最后减少我们的序列为一个单一的返回值;如果初始值init给定,第一个比较会是init和第一个序列元素而不是序列的头两个元素

 

re正则

 

compile(pattern,flags=0)          # 对正则表达式模式pattern进行编译,flags是可选标识符,并返回一个regex对象

match(pattern,string,flags=0)     # 尝试用正则表达式模式pattern匹配字符串string,flags是可选标识符,如果匹配成功,则返回一个匹配对象;否则返回None

search(pattern,string,flags=0)    # 在字符串string中搜索正则表达式模式pattern的第一次出现,flags是可选标识符,如果匹配成功,则返回一个匹配对象;否则返回None

findall(pattern,string[,flags])   # 在字符串string中搜索正则表达式模式pattern的所有(非重复)出现:返回一个匹配对象的列表  # pattern=u‘\u4e2d\u6587‘ 代表UNICODE

finditer(pattern,string[,flags])  # findall()相同,但返回的不是列表而是迭代器;对于每个匹配,该迭代器返回一个匹配对象

split(pattern,string,max=0)       # 根据正则表达式pattern中的分隔符把字符string分割为一个列表,返回成功匹配的列表,最多分割max(默认所有)

sub(pattern,repl,string,max=0)    # 把字符串string中所有匹配正则表达式pattern的地方替换成字符串repl,如果max的值没有给出,则对所有匹配的地方进行替换(subn()会返回一个表示替换次数的数值)

group(num=0)                      # 返回全部匹配对象(或指定编号是num的子组)

groups()                          # 返回一个包含全部匹配的子组的元组(如果没匹配成功,返回一个空元组)

 

例子

re.findall(r‘a[be]c‘,‘123abc456eaec789‘)         # 返回匹配对象列表 [‘abc‘, ‘aec‘]

re.match("^(1|2) *(.*) *abc$", str).group(2)     # 取第二个标签

re.match("^(1|2) *(.*) *abc$", str).groups()     # 取所有标签

re.sub(‘[abc]‘,‘A‘,‘alex‘)                       # 替换

for i in re.finditer(r‘\d+‘,s):                  # 迭代

print i.group(),i.span()                     #

 

搜索网页中UNICODE格式的中文

QueryAdd=‘http://www.anti-spam.org.cn/Rbl/Query/Result‘

Ip=‘222.129.184.52‘

s = requests.post(url=QueryAdd, data={‘IP‘:Ip})

re.findall(u‘\u4e2d\u56fd‘, s.text, re.S)

 

编码转换

 

a=‘中文‘          # 编码未定义按输入终端utf8gbk

u=u‘中文‘         # 定义为unicode编码  u值为 u‘\u4e2d\u6587‘

u.encode(‘utf8‘)  # 转为utf8格式 u值为 ‘\xe4\xb8\xad\xe6\x96\x87‘

print u           # 结果显示 中文

print u.encode(‘utf8‘)      # 转为utf8格式,当显示终端编码为utf8  结果显示 中文  编码不一致则乱码

print u.encode(‘gbk‘)       # 当前终端为utf8 故乱码

 

ord(‘4‘)          # 字符转ASCII

chr(52)           # ASCII码转字符

 

遍历递归

 

[os.path.join(x[0],y) for x in os.walk(‘/root/python/5‘) for y in x[2]]

 

for i in os.walk(‘/root/python/5/work/server‘):

print i

 

常用模块

 

os模块

 

文件处理

mkfifo()/mknod()       # 创建命名管道/创建文件系统节点

remove()/unlink()      # 删除文件

rename()/renames()     # 重命名文件

*stat()                # 返回文件信息

symlink()              # 创建符号链接

utime()                # 更新时间戳

tmpfile()              # 创建并打开(‘w+b‘)一个新的临时文件

walk()                 # 遍历目录树下的所有文件名

 

目录/文件夹

chdir()/fchdir()       # 改变当前工作目录/通过一个文件描述符改变当前工作目录

chroot()               # 改变当前进程的根目录

listdir()              # 列出指定目录的文件

getcwd()/getcwdu()     # 返回当前工作目录/功能相同,但返回一个unicode对象

mkdir()/makedirs()     # 创建目录/创建多层目录

rmdir()/removedirs()   # 删除目录/删除多层目录

 

访问/权限

saccess()              # 检验权限模式

chmod()                # 改变权限模式

chown()/lchown()       # 改变ownergroupID功能相同,但不会跟踪链接

umask()                # 设置默认权限模式

 

文件描述符操作

open()                 # 底层的操作系统open(对于稳健,使用标准的内建open()函数)

read()/write()         # 根据文件描述符读取/写入数据 按大小读取文件部分内容

dup()/dup2()           # 复制文件描述符号/功能相同,但是复制到另一个文件描述符

 

设备号

makedev()              # majorminor设备号创建一个原始设备号

major()/minor()        # 从原始设备号获得major/minor设备号

 

os.path模块

 

os.path.expanduser(‘~/.ssh/key‘)   # 家目录下文件的全路径

 

分隔

basename()         # 去掉目录路径,返回文件名

dirname()          # 去掉文件名,返回目录路径

join()             # 将分离的各部分组合成一个路径名

spllt()            # 返回(dirname(),basename())元组

splitdrive()       # 返回(drivename,pathname)元组

splitext()         # 返回(filename,extension)元组

 

信息

getatime()         # 返回最近访问时间

getctime()         # 返回文件创建时间

getmtime()         # 返回最近文件修改时间

getsize()          # 返回文件大小(字节)

 

查询

exists()          # 指定路径(文件或目录)是否存在

isabs()           # 指定路径是否为绝对路径

isdir()           # 指定路径是否存在且为一个目录

isfile()          # 指定路径是否存在且为一个文件

islink()          # 指定路径是否存在且为一个符号链接

ismount()         # 指定路径是否存在且为一个挂载点

samefile()        # 两个路径名是否指向同一个文件

 

相关模块

base64              # 提供二进制字符串和文本字符串间的编码/解码操作

binascii            # 提供二进制和ASCII编码的二进制字符串间的编码/解码操作

bz2                 # 访问BZ2格式的压缩文件

csv                 # 访问csv文件(逗号分隔文件)

csv.reader(open(file))

filecmp             # 用于比较目录和文件

fileinput           # 提供多个文本文件的行迭代器

getopt/optparse     # 提供了命令行参数的解析/处理

glob/fnmatch        # 提供unix样式的通配符匹配的功能

gzip/zlib           # 读写GNU zip(gzip)文件(压缩需要zlib模块)

shutil              # 提供高级文件访问功能

c/StringIO          # 对字符串对象提供类文件接口

tarfile             # 读写TAR归档文件,支持压缩文件

tempfile            # 创建一个临时文件

uu                  # uu格式的编码和解码

zipfile             # 用于读取zip归档文件的工具

environ[‘HOME‘]     # 查看系统环境变量

 

子进程

os.fork()    # 创建子进程,并复制父进程所有操作  通过判断pid = os.fork() pid,分别执行父进程与子进程操作,0为子进程

os.wait()    # 等待子进程结束

 

跨平台os模块属性

 

linesep         # 用于在文件中分隔行的字符串

sep             # 用来分隔文件路径名字的字符串

pathsep         # 用于分割文件路径的字符串

curdir          # 当前工作目录的字符串名称

pardir          # 父目录字符串名称

 

发送邮件

 

发送邮件内容

 

#!/usr/bin/python

#encoding:utf8

导入 smtplib 和 MIMEText 

import smtplib

from email.mime.text import MIMEText

 

定义发送列表 

mailto_list=["272121935@qq.com","272121935@163.com"]

 

设置服务器名称、用户名、密码以及邮件后缀 

mail_host = "smtp.163.com"

mail_user = "mailuser"

mail_pass = "password"

mail_postfix="163.com"

 

发送邮件函数

def send_mail(to_list, sub):

me = mail_user + "<"+mail_user+"@"+mail_postfix+">"

fp = open(‘context.txt‘)

msg = MIMEText(fp.read(),_charset="utf-8")

fp.close()

msg[‘Subject‘] = sub

msg[‘From‘] = me

msg[‘To‘] = ";".join(to_list)

try:

send_smtp = smtplib.SMTP()

send_smtp.connect(mail_host)

send_smtp.login(mail_user, mail_pass)

send_smtp.sendmail(me, to_list, msg.as_string())

send_smtp.close()

return True

except Exception, e:

print str(e)

return False

 

if send_mail(mailto_list,"标题"):

print "测试成功"

else:

print "测试失败"

 

发送附件

 

#!/usr/bin/python

#encoding:utf8

import smtplib

from email.mime.multipart import MIMEMultipart

from email.mime.base import MIMEBase

from email import encoders

 

def send_mail(to_list, sub, filename):

me = mail_user + "<"+mail_user+"@"+mail_postfix+">"

msg = MIMEMultipart()

msg[‘Subject‘] = sub

msg[‘From‘] = me

msg[‘To‘] = ";".join(to_list)

submsg = MIMEBase(‘application‘, ‘x-xz‘)

submsg.set_payload(open(filename,‘rb‘).read())

encoders.encode_base64(submsg)

submsg.add_header(‘Content-Disposition‘, ‘attachment‘, filename=filename)

msg.attach(submsg)

try:

send_smtp = smtplib.SMTP()

send_smtp.connect(mail_host)

send_smtp.login(mail_user, mail_pass)

send_smtp.sendmail(me, to_list, msg.as_string())

send_smtp.close()

return True

except Exception, e:

print str(e)[1]

return False

 

设置服务器名称、用户名、密码以及邮件后缀 

mail_host = "smtp.163.com"

mail_user = "xuesong"

mail_pass = "mailpasswd"

mail_postfix = "163.com"

mailto_list = ["272121935@qq.com","quanzhou722@163.com"]

title = ‘check‘

filename = ‘file_check.html‘

if send_mail(mailto_list,title,filename):

print "发送成功"

else:

print "发送失败"

 

解压缩

 

gzip压缩

 

import gzip

f_in = open(‘file.log‘, ‘rb‘)

f_out = gzip.open(‘file.log.gz‘, ‘wb‘)

f_out.writelines(f_in)

f_out.close()

f_in.close()

 

gzip压缩1

 

File = ‘xuesong_18.log‘

g = gzip.GzipFile(filename="", mode=‘wb‘, compresslevel=9, fileobj=open((r‘%s.gz‘ %File),‘wb‘))

g.write(open(r‘%s‘ %File).read())

g.close()

 

gzip解压

 

g = gzip.GzipFile(mode=‘rb‘, fileobj=open((r‘xuesong_18.log.gz‘),‘rb‘))

open((r‘xuesong_18.log‘),‘wb‘).write(g.read())

 

压缩tar.gz

 

import os

import tarfile

tar = tarfile.open("/tmp/tartest.tar.gz","w:gz")   # 创建压缩包名

for path,dir,files in os.walk("/tmp/tartest"):     # 递归文件目录

for file in files:

fullpath = os.path.join(path,file)

tar.add(fullpath)                          # 创建压缩包

tar.close()

 

解压tar.gz

 

import tarfile

tar = tarfile.open("/tmp/tartest.tar.gz")

#tar.extract("/tmp")                           # 全部解压到指定路径

names = tar.getnames()                         # 包内文件名

for name in names:

tar.extract(name,path="./")                # 解压指定文件

tar.close()

 

zip压缩

import zipfile,os

f = zipfile.ZipFile(‘filename.zip‘, ‘w‘ ,zipfile.ZIP_DEFLATED)    # ZIP_STORE 为默认表不压缩. ZIP_DEFLATED 表压缩

#f.write(‘file1.txt‘)                              # 将文件写入压缩包

for path,dir,files in os.walk("tartest"):          # 递归压缩目录

for file in files:

f.write(os.path.join(path,file))           # 将文件逐个写入压缩包         

f.close()

 

zip解压

if zipfile.is_zipfile(‘filename.zip‘):        # 判断一个文件是不是zip文件

f = zipfile.ZipFile(‘filename.zip‘)

for file in f.namelist():                 # 返回文件列表

f.extract(file, r‘/tmp/‘)             # 解压指定文件

#f.extractall()                           # 解压全部

f.close()

 

时间

 

import time

time.strftime(‘%Y-%m-%d_%X‘,time.localtime( time.time() ) )

 

格式化时间

tomorrow.strftime(‘%Y%m%d_%H%M‘)

 

上一个月最后一天

import datetime

lastMonth=datetime.date(datetime.date.today().year,datetime.date.today().month,1)-datetime.timedelta(1)

lastMonth.strftime("%Y/%m")

 

前一天

(datetime.datetime.now() + datetime.timedelta(days=-1) ).strftime(‘%Y%m%d‘)

 

上个月

time.localtime()[1] - 1

 

时间戳转与可读时间之间转换

a=time.time()

time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(a))

time.mktime(time.strptime(‘2012-03-28 06:53:40‘, ‘%Y-%m-%d %H:%M:%S‘))

 

输入时间格式判断

 

#encoding:utf8

import time

while 1:

atime=raw_input(‘输入格式如[14.05.13 13:00]:‘)

try:

btime=time.mktime(time.strptime(‘%s:00‘ %atime, ‘%y.%m.%d %H:%M:%S‘))

break

except:

print ‘时间输入错误,请重新输入,格式如[14.05.13 13:00]‘

 

两日期相差天数

 

import datetime

d1 = datetime.datetime(2005, 2, 16)

d2 = datetime.datetime(2004, 12, 31)

(d1 - d2).days

 

向后加10个小时

 

import datetime

d1 = datetime.datetime.now()

d3 = d1 + datetime.timedelta(hours=10)

d3.ctime()

 

hash

 

import md5

m = md5.new(‘123456‘).hexdigest()

 

import hashlib

m = hashlib.md5()

m.update("Nobody inspects")    # 使用update方法对字符串md5加密

m.digest()                     # 加密后二进制结果

m.hexdigest()                  # 加密后十进制结果

hashlib.new("md5", "string").hexdigest()               # 对字符串加密

hashlib.new("md5", open("file").read()).hexdigest()    # 查看文件MD5

 

隐藏输入密码

 

import getpass

passwd=getpass.getpass()

 

string打印a-z

import string

string.lowercase       # a-z小写

string.uppercase       # A-Z大小

 

3 socket

 

from socket import *         # 避免 socket.socket()

 

s.bind()         # 绑定地址到套接字

s.listen()       # 开始TCP监听

s.accept()       # 被动接受TCP客户端连接,等待连接的到来

s.connect()      # 主动初始化TCP服务器连接

s.connect_ex()   # connect()函数的扩展版本,出错时返回出错码,而不是跑出异常

s.recv()         # 接收TCP数据

s.send()         # 发送TCP数据

s.sendall()      # 完整发送TCP数据

s.recvfrom()     # 接收UDP数据

s.sendto()       # 发送UDP数据

s.getpeername()  # 连接到当前套接字的远端的地址(TCP连接)

s.getsockname()  # 当前套接字的地址

s.getsockopt()   # 返回指定套接字的参数

s.setsockopt()   # 设置指定套接字的参数

s.close()        # 关闭套接字

s.setblocking()  # 设置套接字的阻塞与非阻塞模式

s.settimeout()   # 设置阻塞套接字操作的超时时间

s.gettimeout()   # 得到阻塞套接字操作的超时时间

s.filen0()       # 套接字的文件描述符

s.makefile()     # 创建一个与该套接字关联的文件对象

 

socket.AF_UNIX  # 只能够用于单一的Unix系统进程间通信

socket.AF_INET   # 服务器之间网络通信

socket.AF_INET6  # IPv6

 

socket.SOCK_STREAM   # 流式socket , for TCP

socket.SOCK_DGRAM   # 数据报式socket , for UDP

socket.SOCK_RAW       # 原始套接字,普通的套接字无法处理ICMPIGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。

 

socket.SOCK_RDM    # 是一种可靠的UDP形式,即保证交付数据报但不保证顺序。SOCK_RAM用来提供对原始协议的低级访问,在需要执行某些特殊操作时使用,如发送ICMP报文。SOCK_RAM通常仅限于高级用户或管理员运行的程序使用。

 

socket.SOCK_SEQPACKET  # 可靠的连续数据包服务

 

SocketServer

 

#!/usr/bin/python

#server.py

import SocketServer

import os

class MyTCP(SocketServer.BaseRequestHandler):

def handle(self):

while True:

self.data=self.request.recv(1024).strip()

if self.data == ‘quit‘ or not self.data:break

 

cmd=os.popen(self.data).read()

if cmd == ‘‘:cmd= self.data + ‘: Command not found‘

self.request.sendall(cmd)

if __name__ == ‘__main__‘:

HOST,PORT = ‘10.0.0.119‘,50007

server = SocketServer.ThreadingTCPServer((HOST,PORT),MyTCP)

server.serve_forever()

 

SocketClient

 

#!/usr/bin/python

#client.py

import socket

 

HOST=‘10.0.0.119‘

PORT=50007

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect((HOST,PORT))

 

while True:

while True:

cmd=raw_input(‘CMD:‘).strip()

if cmd != ‘‘:break

s.sendall(cmd)      

data=s.recv(1024).split(‘\n‘)

print ‘cmd:‘

for line in data:print line

s.close()

 

ftp

 

ftpserver

 

#!/usr/bin/python

#ftpserver.py

 

import SocketServer

import os

import cPickle

import md5

from time import sleep

 

def filer(file1):

try:

f = file(file1,‘rb‘)

return cPickle.load(f)

except IOError:

return {}

except EOFError:

return {}

f.close()

 

def filew(file1,content):

f = file(file1,‘wb‘)

cPickle.dump(content,f)

f.close()

 

class MyTCP(SocketServer.BaseRequestHandler):

def handle(self):

i = 0

while i<3:

user=self.request.recv(1024).strip()

userinfo=filer(‘user.pkl‘)

if userinfo.has_key(user.split()[0]):

if md5.new(user.split()[1]).hexdigest() == userinfo[user.split()[0]]:

results=‘login successful‘

self.request.sendall(results)

login=‘successful‘

break

else:

i = i + 1

results=‘Error:password not correct‘

self.request.sendall(results)

continue

else:

i = i + 1

results=‘Error:password not correct‘

self.request.sendall(results)

continue

break

else:

results = ‘Error:Wrong password too many times‘

self.request.sendall(results)

login=‘failure‘

home_path = os.popen(‘pwd‘).read().strip() + ‘/‘ + user.split()[0]

current_path = ‘/‘

print home_path

while True:

if login == ‘failure‘:

break

print ‘home_path:%s=current_path:%s‘ %(home_path,current_path)

cmd=self.request.recv(1024).strip()

print cmd

if cmd == ‘quit‘:

break

elif cmd == ‘dir‘:

list=os.listdir(‘%s%s‘ %(home_path,current_path))

if list:

dirlist,filelist = ‘‘,‘‘

for i in list:

if os.path.isdir(‘%s%s%s‘ %(home_path,current_path,i)):

dirlist = dirlist + ‘\033[32m‘ + i + ‘\033[m\t‘

else:

filelist = filelist + i + ‘\t‘

results = dirlist + filelist

else:

results = ‘\033[31mnot find\033[m‘

self.request.sendall(results)

elif cmd == ‘pdir‘:

self.request.sendall(current_path)

elif cmd.split()[0] == ‘mdir‘:

if cmd.split()[1].isalnum():

tmppath=‘%s%s%s‘ %(home_path,current_path,cmd.split()[1])

os.makedirs(tmppath)

self.request.sendall(‘\033[32mcreating successful\033[m‘)

else:

self.request.sendall(‘\033[31mcreate failure\033[m‘)

elif cmd.split()[0] == ‘cdir‘:

if cmd.split()[1] == ‘/‘:

tmppath=‘%s%s‘ %(home_path,cmd.split()[1])

if os.path.isdir(tmppath):

current_path = cmd.split()[1]

self.request.sendall(current_path)

else:

self.request.sendall(‘\033[31mnot_directory\033[m‘)

elif cmd.split()[1].startswith(‘/‘):

tmppath=‘%s%s‘ %(home_path,cmd.split()[1])

if os.path.isdir(tmppath):

current_path = cmd.split()[1] + ‘/‘

self.request.sendall(current_path)

else:

self.request.sendall(‘\033[31mnot_directory\033[m‘)

else:

tmppath=‘%s%s%s‘ %(home_path,current_path,cmd.split()[1])

if os.path.isdir(tmppath):

current_path = current_path + cmd.split()[1] + ‘/‘

self.request.sendall(current_path)

else:

self.request.sendall(‘\033[31mnot_directory\033[m‘)

elif cmd.split()[0] == ‘get‘:

if os.path.isfile(‘%s%s%s‘ %(home_path,current_path,cmd.split()[1])):

f = file(‘%s%s%s‘ %(home_path,current_path,cmd.split()[1]),‘rb‘)

self.request.sendall(‘ready_file‘)

sleep(0.5)

self.request.send(f.read())

f.close()

sleep(0.5)

elif os.path.isdir(‘%s%s%s‘ %(home_path,current_path,cmd.split()[1])):

self.request.sendall(‘ready_dir‘)

sleep(0.5)

for dirpath in os.walk(‘%s%s%s‘ %(home_path,current_path,cmd.split()[1])):

dir=dirpath[0].replace(‘%s%s‘ %(home_path,current_path),‘‘,1)

self.request.sendall(dir)

sleep(0.5)

for filename in dirpath[2]:

self.request.sendall(filename)

sleep(0.5)

f = file(‘%s/%s‘ %(dirpath[0],filename),‘rb‘)

self.request.send(f.read())

f.close()

sleep(0.5)

self.request.sendall(‘file_get_done‘)

sleep(0.5)

else:

self.request.sendall(‘dir_get_done‘)

sleep(0.5)

else:

self.request.sendall(‘get_failure‘)

continue

self.request.sendall(‘get_done‘)

 

elif cmd.split()[0] == ‘send‘:

if os.path.exists(‘%s%s%s‘ %(home_path,current_path,cmd.split()[1])):

self.request.sendall(‘existing‘)

action=self.request.recv(1024)

if action == ‘cancel‘:

continue

self.request.sendall(‘ready‘)

msg=self.request.recv(1024)

if msg == ‘ready_file‘:

f = file(‘%s%s%s‘ %(home_path,current_path,cmd.split()[1]),‘wb‘)

while True:

data=self.request.recv(1024)

if data == ‘file_send_done‘:break

f.write(data)

f.close()

 

elif msg == ‘ready_dir‘:

os.system(‘mkdir -p %s%s%s‘ %(home_path,current_path,cmd.split()[1]))

while True:

dir=self.request.recv(1024)

if dir == ‘get_done‘:break

os.system(‘mkdir -p %s%s%s‘ %(home_path,current_path,dir))

while True:

filename=self.request.recv(1024)

if filename == ‘dir_send_done‘:break

f = file(‘%s%s%s/%s‘ %(home_path,current_path,dir,filename),‘wb‘)

while True:

data=self.request.recv(1024)

if data == ‘file_send_done‘:break 

f.write(data)

f.close()

self.request.sendall(‘%s/%s\t\033[32mfile_done\033[m‘ %(dir,filename))

self.request.sendall(‘%s\t\033[32mdir_done\033[m‘ %(dir))

elif msg == ‘unknown_file‘:

continue

 

else:

results = cmd.split()[0] + ‘: Command not found‘

self.request.sendall(results)

 

if __name__ == ‘__main__‘:

HOST,PORT = ‘10.152.14.85‘,50007

server = SocketServer.ThreadingTCPServer((HOST,PORT),MyTCP)

server.serve_forever()

 

ftpmanage

 

#!/usr/bin/python

#manage_ftp.py

import cPickle

import sys

import md5

import os

import getpass

 

def filer(file1):

try:

f = file(file1,‘rb‘)

return cPickle.load(f)

except IOError:

return {}

except EOFError:

return {}

f.close()

 

def filew(file1,content):

f = file(file1,‘wb‘)

cPickle.dump(content,f)

f.close()

 

while True:

print ‘‘‘

1.add user

2.del user

3.change password

4.query user

0.exit

‘‘‘

i = raw_input(‘:‘).strip()

userinfo=filer(‘user.pkl‘)

if i == ‘‘:

continue

elif i == ‘1‘:

while True:

user=raw_input(‘user name:‘).strip()

if user.isalnum():

i = 0

while i<3:

passwd=getpass.getpass(‘passwd:‘).strip()

if passwd == ‘‘:

continue

else:

passwd1=getpass.getpass(‘Confirm password:‘).strip()

if passwd == passwd1:

mpasswd = md5.new(passwd).hexdigest()

userinfo[user] = mpasswd

os.system(‘mkdir -p %s‘ %user)

print ‘%s creating successful ‘ %user

break

else:

print "Passwords don‘t match "

i = i + 1

continue

else:

print ‘Too many wrong‘

continue

break

else:

print ‘user not legal‘

continue

elif i == ‘2‘:

user=raw_input(‘user name:‘).strip()

if userinfo.has_key(user):

del userinfo[user]

print ‘Delete users successfully‘

else:

print ‘user not exist‘

continue

elif i == ‘3‘:

user=raw_input(‘user name:‘).strip()

if userinfo.has_key(user):

i = 0

while i<3:

passwd=getpass.getpass(‘passwd:‘).strip()

if passwd == ‘‘:

continue

else:

passwd1=getpass.getpass(‘Confirm password:‘).strip()

if passwd == passwd1:

mpasswd = md5.new(passwd).hexdigest()

userinfo[user] = mpasswd

print ‘%s password is changed‘ %user

break

else:

print "Passwords don‘t match "

i = i + 1

continue

else:

print ‘Too many wrong‘

continue

else:

print ‘user not exist‘

continue

elif i == ‘4‘:

print userinfo.keys()

elif i == ‘0‘:

sys.exit()

else:

print ‘select error‘

continue

filew(‘user.pkl‘,content=userinfo)

 

ftpclient

 

#!/usr/bin/python

#ftpclient.py

 

import socket

import os

import getpass

from time import sleep

 

HOST=‘10.152.14.85‘

PORT=50007

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect((HOST,PORT))

 

while True:

user = raw_input(‘user:‘).strip()

if user.isalnum():

while True:

passwd = getpass.getpass(‘passwd:‘).strip()

s.sendall(user + ‘ ‘ + passwd)

servercmd=s.recv(1024)

if servercmd == ‘login successful‘:

print ‘\033[32m%s\033[m‘ %servercmd

break

else:

print servercmd

 

while True:

cmd=raw_input(‘FTP>‘).strip()

if cmd == ‘‘:

continue

if cmd.split()[0] == ‘get‘:

if cmd == ‘get‘:continue

for i in cmd.split()[1:]:

if os.path.exists(i):

confirm = raw_input("\033[31mPlease confirm whether the cover %s(Y/N):\033[m" %(i)).upper().startswith(‘Y‘)

if not confirm:

print ‘%s cancel‘ %i

continue

s.sendall(‘get ‘ + i)

servercmd=s.recv(1024)

if servercmd == ‘inexistence‘:

print ‘%s \t\033[32minexistence\033[m‘ %i

continue

elif servercmd == ‘ready_file‘:

f = file(i,‘wb‘)

while True:

data=s.recv(1024)

if data == ‘get_done‘:break 

f.write(data)

f.close()

print ‘%s \t\033[32mfile_done\033[m‘ %(i)

elif servercmd == ‘ready_dir‘:

try:

os.makedirs(i)

except:

pass

while True:

serverdir=s.recv(1024)

if serverdir == ‘get_done‘:break 

os.system(‘mkdir -p %s‘ %serverdir)

print ‘%s \t\033[32mdir_done\033[m‘ %(serverdir)

while True:

serverfile=s.recv(1024)

if serverfile == ‘dir_get_done‘:break 

f = file(‘%s/%s‘ %(serverdir,serverfile),‘wb‘)

while True:

data=s.recv(1024)

if data == ‘file_get_done‘:break 

f.write(data)

f.close()

print ‘%s/%s \t\033[32mfile_done\033[m‘ %(serverdir,serverfile)

 

elif cmd.split()[0] == ‘send‘:

 

if cmd == ‘send‘:continue

for i in cmd.split()[1:]:

if not os.path.exists(i):

print ‘%s\t\033[31minexistence\033[m‘ %i

continue

 

s.sendall(‘send ‘ + i)

servercmd=s.recv(1024)

if servercmd == ‘existing‘:

confirm = raw_input("\033[31mPlease confirm whether the cover %s(Y/N):\033[m" %(i)).upper().startswith(‘Y‘)

if confirm:

s.sendall(‘cover‘)

servercmd=s.recv(1024)

else:

s.sendall(‘cancel‘)

print ‘%s\tcancel‘ %i

continue

 

if os.path.isfile(i):

s.sendall(‘ready_file‘)

sleep(0.5)

f = file(i,‘rb‘)

s.send(f.read())

sleep(0.5)

s.sendall(‘file_send_done‘)

print ‘%s\t\033[32mfile done\033[m‘ %(cmd.split()[1])

f.close()

elif os.path.isdir(i):

s.sendall(‘ready_dir‘)

sleep(0.5)

for dirpath in os.walk(i):

dir=dirpath[0].replace(‘%s/‘ %os.popen(‘pwd‘).read().strip(),‘‘,1)

s.sendall(dir)

sleep(0.5)

for filename in dirpath[2]:

s.sendall(filename)

sleep(0.5)

f = file(‘%s/%s‘ %(dirpath[0],filename),‘rb‘)

s.send(f.read())

f.close()

sleep(0.5)

s.sendall(‘file_send_done‘)

msg=s.recv(1024)

print msg

 

else:

s.sendall(‘dir_send_done‘)

msg=s.recv(1024)

print msg

 

else:

s.sendall(‘unknown_file‘)

print ‘%s\t\033[31munknown type\033[m‘ %i

continue

sleep(0.5)

s.sendall(‘get_done‘)

 

elif cmd.split()[0] == ‘cdir‘:

if cmd == ‘cdir‘:continue

s.sendall(cmd)

data=s.recv(1024)

print data

continue

elif cmd == ‘ls‘:

list=os.popen(cmd).read().strip().split(‘\n‘)

if list:

dirlist,filelist = ‘‘,‘‘

for i in list:

if os.path.isdir(i):

dirlist = dirlist + ‘\033[32m‘ + i + ‘\033[m\t‘

else:

filelist = filelist + i + ‘\t‘

results = dirlist + filelist

else:

results = ‘\033[31mnot find\033[m‘

print results

continue

elif cmd == ‘pwd‘:

os.system(cmd)

elif cmd.split()[0] == ‘cd‘:

try:

os.chdir(cmd.split()[1])

except:

print ‘\033[31mcd failure\033[m‘

elif cmd == ‘dir‘:

s.sendall(cmd)

data=s.recv(1024)

print data

continue

elif cmd == ‘pdir‘:

s.sendall(cmd)

data=s.recv(1024)

print data

continue

elif cmd.split()[0] == ‘mdir‘:

if cmd == ‘mdir‘:continue

s.sendall(cmd)

data=s.recv(1024)

print data

continue

elif cmd.split()[0] == ‘help‘:

print ‘‘‘

get [file] [dir]

send [file] [dir]

 

dir

mdir

cdir

pdir

 

pwd

md

cd

ls

 

help

quit

‘‘‘

continue

elif cmd == ‘quit‘:

break

else:

print ‘\033[31m%s: Command not found,Please see the "help"\033[m‘ %cmd

else:

continue

break

s.close()

 

扫描主机开放端口

#!/usr/bin/env python

 

import socket

 

def check_server(address,port):

s=socket.socket()

try:

s.connect((address,port))

return True

except socket.error,e:

return False

 

if __name__==‘__main__‘:

from optparse import OptionParser

parser=OptionParser()

parser.add_option("-a","--address",dest="address",default=‘localhost‘,help="Address for server",metavar="ADDRESS")

parser.add_option("-s","--start",dest="start_port",type="int",default=1,help="start port",metavar="SPORT")

parser.add_option("-e","--end",dest="end_port",type="int",default=1,help="end port",metavar="EPORT")

(options,args)=parser.parse_args()

print ‘options: %s, args: %s‘ % (options, args)

port=options.start_port

while(port<=options.end_port):

check = check_server(options.address, port)

if (check):

print ‘Port  %s is on‘ % port

port=port+1

 

4 mysql

 

#apt-get install mysql-server

#apt-get install python-MySQLdb

help(MySQLdb.connections.Connection)      # 查看链接参数

 

conn=MySQLdb.connect(host=‘localhost‘,user=‘root‘,passwd=‘123456‘,db=‘fortress‘,port=3306)    # 定义连接

#conn=MySQLdb.connect(unix_socket=‘/var/run/mysqld/mysqld.sock‘,user=‘root‘,passwd=‘123456‘)   # 使用socket文件链接

cur=conn.cursor()                                            # 定义游标

conn.select_db(‘fortress‘)                                   # 选择数据库

sqlcmd = ‘insert into user(name,age) value(%s,%s)‘           # 定义sql命令

cur.executemany(sqlcmd,[(‘aa‘,1),(‘bb‘,2),(‘cc‘,3)])         # 插入多条值

cur.execute(‘delete from user where id=20‘)                  # 删除一条记录

cur.execute("update user set name=‘a‘ where id=20")          # 更细数据

sqlresult = cur.fetchall()                                   # 接收全部返回结果

conn.commit()                                                # 提交

cur.close()                                                  # 关闭游标

conn.close()                                                 # 关闭连接

 

import MySQLdb

def mydb(dbcmdlist):

try:

conn=MySQLdb.connect(host=‘localhost‘,user=‘root‘,passwd=‘123456‘,db=‘fortress‘,port=3306)

cur=conn.cursor()

 

cur.execute(‘create database if not exists fortress;‘)  # 创建数据库

conn.select_db(‘fortress‘)                              # 选择数据库

cur.execute(‘drop table if exists log;‘)                # 删除表

cur.execute(‘CREATE TABLE log ( id BIGINT(20) NOT NULL AUTO_INCREMENT, loginuser VARCHAR(50) DEFAULT NULL, remoteip VARCHAR(50) DEFAULT NULL, PRIMARY KEY (id) );‘)  # 创建表

 

result=[]

for dbcmd in dbcmdlist:

cur.execute(dbcmd)           # 执行sql

sqlresult = cur.fetchall()   # 接收全部返回结果

result.append(sqlresult)

conn.commit()                    # 提交

cur.close()

conn.close()

return result

except MySQLdb.Error,e:

print ‘mysql error msg: ‘,e

sqlcmd=[]

sqlcmd.append("insert into log (loginuser,remoteip)values(‘%s‘,‘%s‘);" %(loginuser,remoteip))

mydb(sqlcmd)

 

sqlcmd=[]

sqlcmd.append("select * from log;")

result = mydb(sqlcmd)

for i in result[0]:

print i

 

处理信号

 

信号的概念

 

信号(signal): 进程之间通讯的方式,是一种软件中断。一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。

发送信号一般有两种原因:

1(被动式)  内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号

2(主动式)  通过系统调用kill来向指定进程发送信号

操作系统规定了进程收到信号以后的默认行为,可以通过绑定信号处理函数来修改进程收到信号以后的行为,有两个信号是不可更改的 SIGTOP 和 SIGKILL

如果一个进程收到一个SIGUSR1信号,然后执行信号绑定函数,第二个SIGUSR2信号又来了,第一个信号没有被处理完毕的话,第二个信号就会丢弃。

进程结束信号 SIGTERM 和 SIGKILL 的区别:  SIGTERM 比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。

 

常见信号

kill -l      # 查看linux提供的信号

 

SIGHUP  1          A     # 终端挂起或者控制进程终止

SIGINT  2          A     # 键盘终端进程(control+c)

SIGQUIT 3          C     # 键盘的退出键被按下

SIGILL  4          C     # 非法指令

SIGABRT 6          C     # abort(3)发出的退出指令

SIGFPE  8          C     # 浮点异常

SIGKILL 9          AEF   # Kill信号  立刻停止

SIGSEGV 11         C     # 无效的内存引用

SIGPIPE 13         A     # 管道破裂写一个没有读端口的管道

SIGALRM 14         A     # 闹钟信号 由alarm(2)发出的信号 

SIGTERM 15         A     # 终止信号,可让程序安全退出 kill -15

SIGUSR1 30,10,16   A     # 用户自定义信号1

SIGUSR2 31,12,17   A     # 用户自定义信号2

SIGCHLD 20,17,18   B     # 子进程结束自动向父进程发送SIGCHLD信号

SIGCONT 19,18,25         # 进程继续(曾被停止的进程)

SIGSTOP 17,19,23   DEF   # 终止进程

SIGTSTP 18,20,24   D     # 控制终端(tty)上按下停止键

SIGTTIN 21,21,26   D     # 后台进程企图从控制终端读

SIGTTOU 22,22,27   D     # 后台进程企图从控制终端写

 

缺省处理动作一项中的字母含义如下:

A  缺省的动作是终止进程

B  缺省的动作是忽略此信号,将该信号丢弃,不做处理

C  缺省的动作是终止进程并进行内核映像转储(dump core),内核映像转储是指将进程数据在内存的映像和进程在内核结构中的部分内容以一定格式转储到文件系统,并且进程退出执行,这样做的好处是为程序员提供了方便,使得他们可以得到进程当时执行时的数据值,允许他们确定转储的原因,并且可以调试他们的程序。

D  缺省的动作是停止进程,进入停止状况以后还能重新进行下去,一般是在调试的过程中(例如ptrace系统调用)

E  信号不能被捕获

F  信号不能被忽略

 

Python提供的信号

import signal

dir(signal)

[‘NSIG‘, ‘SIGABRT‘, ‘SIGALRM‘, ‘SIGBUS‘, ‘SIGCHLD‘, ‘SIGCLD‘, ‘SIGCONT‘, ‘SIGFPE‘, ‘SIGHUP‘, ‘SIGILL‘, ‘SIGINT‘, ‘SIGIO‘, ‘SIGIOT‘, ‘SIGKILL‘, ‘SIGPIPE‘, ‘SIGPOLL‘, ‘SIGPROF‘, ‘SIGPWR‘, ‘SIGQUIT‘, ‘SIGRTMAX‘, ‘SIGRTMIN‘, ‘SIGSEGV‘, ‘SIGSTOP‘, ‘SIGSYS‘, ‘SIGTERM‘, ‘SIGTRAP‘, ‘SIGTSTP‘, ‘SIGTTIN‘, ‘SIGTTOU‘, ‘SIGURG‘, ‘SIGUSR1‘, ‘SIGUSR2‘, ‘SIGVTALRM‘, ‘SIGWINCH‘, ‘SIGXCPU‘, ‘SIGXFSZ‘, ‘SIG_DFL‘, ‘SIG_IGN‘, ‘__doc__‘, ‘__name__‘, ‘alarm‘, ‘default_int_handler‘, ‘getsignal‘, ‘pause‘, ‘signal‘]

 

绑定信号处理函数

#encoding:utf8

import os,signal

from time import sleep

def onsignal_term(a,b):

print ‘SIGTERM‘      # kill -15

signal.signal(signal.SIGTERM,onsignal_term)     # 接收信号,执行相应函数

 

def onsignal_usr1(a,b):

print ‘SIGUSR1‘      # kill -10

signal.signal(signal.SIGUSR1,onsignal_usr1)

 

while 1:

print ‘ID‘,os.getpid()

sleep(10)

 

通过另外一个进程发送信号

import os,signal

os.kill(16175,signal.SIGTERM)    # 发送信号,16175是绑定信号处理函数的进程pid,需要自行修改

os.kill(16175,signal.SIGUSR1)

 

父进程接收子进程结束发送的SIGCHLD信号

#encoding:utf8

import os,signal

from time import sleep

   

def onsigchld(a,b):

print ‘收到子进程结束信号

signal.signal(signal.SIGCHLD,onsigchld)

   

pid = os.fork()                # 创建一个子进程,复制父进程所有资源操作

if pid == 0:                   # 通过判断子进程os.fork()是否等于0,分别同时执行父进程与子进程操作

   print ‘我是子进程,pid‘,os.getpid()

   sleep(2)

else:

print ‘我是父进程,pid‘,os.getpid()

os.wait()      # 等待子进程结束

 

接收信号的程序,另外一端使用多线程向这个进程发送信号,会遗漏一些信号

#encoding:utf8

import os

import signal

from time import sleep  

import Queue

QCOUNT = Queue.Queue()  # 初始化队列  

def onsigchld(a,b):  

‘‘‘收到信号后向队列中插入一个数字1‘‘‘

print ‘收到SIGUSR1信号

sleep(1)

QCOUNT.put(1)       # 向队列中写入

signal.signal(signal.SIGUSR1,onsigchld)   # 绑定信号处理函数

while 1:

print ‘我的pid‘,os.getpid()

print ‘现在队列中元素的个数是‘,QCOUNT.qsize()

sleep(2)

 

多线程发信号端的程序

 

#encoding:utf8

import threading

import os

import signal

def sendusr1():

print ‘发送信号

os.kill(17788, signal.SIGUSR1)     # 这里的进程id需要写前一个程序实际运行的pid

WORKER = []

for i in range(1, 7):                  # 开启6个线程

threadinstance = threading.Thread(target = sendusr1)

WORKER.append(threadinstance)  

for i in WORKER:

i.start()

for i in WORKER:

i.join()

print ‘主线程完成

 

缓存数据库

 

python使用memcache

 

easy_install python-memcached   # 安装(python2.7+)

import memcache

mc = memcache.Client([‘10.152.14.85:12000‘],debug=True)

mc.set(‘name‘,‘luo‘,60)

mc.get(‘name‘)

mc.delete(‘name1‘)

 

保存数据

 

set(key,value,timeout)      # key映射到valuetimeout指的是什么时候这个映射失效

add(key,value,timeout)      # 仅当存储空间中不存在键相同的数据时才保存

replace(key,value,timeout)  # 仅当存储空间中存在键相同的数据时才保存

 

获取数据

 

get(key)                    # 返回key所指向的value

get_multi(key1,key2,key3)   # 可以非同步地同时取得多个键值, 比循环调用get快数十倍

 

python使用mongodb

 

原文: http://blog.nosqlfan.com/html/2989.html

 

easy_install pymongo      # 安装(python2.7+)

import pymongo

connection=pymongo.Connection(‘localhost‘,27017)   # 创建连接

db = connection.test_database                      # 切换数据库

collection = db.test_collection                    # 获取collection

# dbcollection都是延时创建的,在添加Document时才真正创建

 

文档添加, _id自动创建

import datetime

post = {"author": "Mike",

"text": "My first blog post!",

"tags": ["mongodb", "python", "pymongo"],

"date": datetime.datetime.utcnow()}

posts = db.posts

posts.insert(post)

ObjectId(‘...‘)

 

批量插入

new_posts = [{"author": "Mike",

"text": "Another post!",

"tags": ["bulk", "insert"],

"date": datetime.datetime(2009, 11, 12, 11, 14)},

{"author": "Eliot",

"title": "MongoDB is fun",

"text": "and pretty easy too!",

"date": datetime.datetime(2009, 11, 10, 10, 45)}]

posts.insert(new_posts)

[ObjectId(‘...‘), ObjectId(‘...‘)]

 

获取所有collection

db.collection_names()    # 相当于SQLshow tables

 

获取单个文档

posts.find_one()

 

查询多个文档

for post in posts.find():

post

 

加条件的查询

posts.find_one({"author": "Mike"})

 

高级查询

posts.find({"date": {"$lt": "d"}}).sort("author")

 

统计数量

posts.count()

 

加索引

from pymongo import ASCENDING, DESCENDING

posts.create_index([("date", DESCENDING), ("author", ASCENDING)])

 

查看查询语句的性能

posts.find({"date": {"$lt": "d"}}).sort("author").explain()["cursor"]

posts.find({"date": {"$lt": "d"}}).sort("author").explain()["nscanned"]

 

python使用redis

 

https://pypi.python.org/pypi/redis

pip install redis  OR easy_install redis

import redis

r = redis.StrictRedis(host=‘localhost‘, port=6379, db=0)

r.set(‘foo‘, ‘bar‘)

r.get(‘foo‘)

r.save()

 

分片 没搞懂

redis.connection.Connection(host=‘localhost‘, port=6379, db=0,  parser_class=<class ‘redis.connection.PythonParser‘>)

redis.ConnectionPool( connection_class=<class ‘redis.connection.Connection‘>, max_connections=None, **connection_kwargs)

 

7 web页面操作

 

paramiko [ssh客户端]

 

安装

sudo apt-get install python-setuptools 

easy_install

sudo apt-get install python-all-dev

sudo apt-get install build-essential

 

paramiko实例(账号密码登录执行命令)

 

#!/usr/bin/python

#ssh

import paramiko

import sys,os

 

host = ‘10.152.15.200‘

user = ‘peterli‘

password = ‘123456‘

 

s = paramiko.SSHClient()                                 # 绑定实例

s.load_system_host_keys()                                # 加载本地HOST主机文件

s.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # 允许连接不在know_hosts文件中的主机

s.connect(host,22,user,password,timeout=5)               # 连接远程主机

while True:

cmd=raw_input(‘cmd:‘)

stdin,stdout,stderr = s.exec_command(cmd)        # 执行命令

cmd_result = stdout.read(),stderr.read()         # 读取命令结果

for line in cmd_result:

print line,

s.close()

 

paramiko实例(传送文件)

 

#!/usr/bin/evn python

import os

import paramiko

host=‘127.0.0.1‘

port=22

username = ‘peterli‘

password = ‘123456‘

ssh=paramiko.Transport((host,port))

privatekeyfile = os.path.expanduser(‘~/.ssh/id_rsa‘) 

mykey = paramiko.RSAKey.from_private_key_file( os.path.expanduser(‘~/.ssh/id_rsa‘))   # 加载key 不使用key可不加

ssh.connect(username=username,password=password)           # 连接远程主机

使用key把 password=password 换成 pkey=mykey

sftp=paramiko.SFTPClient.from_transport(ssh)               # SFTP使用Transport通道

sftp.get(‘/etc/passwd‘,‘pwd1‘)                             # 下载 两端都要指定文件名

sftp.put(‘pwd‘,‘/tmp/pwd‘)                                 # 上传

sftp.close()

ssh.close()

 

paramiko实例(密钥执行命令)

 

#!/usr/bin/python

#ssh

import paramiko

import sys,os

host = ‘10.152.15.123‘

user = ‘peterli‘

s = paramiko.SSHClient()

s.load_system_host_keys()

s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

privatekeyfile = os.path.expanduser(‘~/.ssh/id_rsa‘)             # 定义key路径

mykey = paramiko.RSAKey.from_private_key_file(privatekeyfile)

# mykey=paramiko.DSSKey.from_private_key_file(privatekeyfile,password=‘061128‘)   # DSSKey方式 passwordkey的密码

s.connect(host,22,user,pkey=mykey,timeout=5)

cmd=raw_input(‘cmd:‘)

stdin,stdout,stderr = s.exec_command(cmd)

cmd_result = stdout.read(),stderr.read()

for line in cmd_result:

print line,

s.close()

 

ssh并发(Pool控制最大并发)

 

#!/usr/bin/env python

#encoding:utf8

#ssh_concurrent.py

 

import multiprocessing

import sys,os,time

import paramiko

 

def ssh_cmd(host,port,user,passwd,cmd):

msg = "-----------Result:%s----------" % host

 

s = paramiko.SSHClient()

s.load_system_host_keys()

s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

try:

s.connect(host,22,user,passwd,timeout=5) 

stdin,stdout,stderr = s.exec_command(cmd)

 

cmd_result = stdout.read(),stderr.read()

print msg

for line in cmd_result:

print line,

 

s.close()

except paramiko.AuthenticationException:

print msg

print ‘AuthenticationException Failed‘

except paramiko.BadHostKeyException:

print msg

print "Bad host key"

 

result = []

p = multiprocessing.Pool(processes=20)

cmd=raw_input(‘CMD:‘)

f=open(‘serverlist.conf‘)

list = f.readlines()

f.close()

for IP in list:

print IP

host=IP.split()[0]

port=int(IP.split()[1])

user=IP.split()[2]

passwd=IP.split()[3]

result.append(p.apply_async(ssh_cmd,(host,port,user,passwd,cmd)))

 

p.close()

 

for res in result:

res.get(timeout=35)

 

ssh并发(取文件状态并发送邮件)

 

#!/usr/bin/python

#encoding:utf8

#config file: ip.list

 

import paramiko

import multiprocessing

import smtplib

import sys,os,time,datetime,socket,re

from email.mime.text import MIMEText

 

配置文件(IP列表)

Conf = ‘ip.list‘

user_name = ‘peterli‘

user_pwd = ‘passwd‘

port = 22

PATH = ‘/home/peterli/‘

 

设置服务器名称、用户名、密码以及邮件后缀 

mail_host = "smtp.163.com"

mail_user = "xuesong"

mail_pass = "mailpasswd"

mail_postfix = "163.com"

mailto_list = ["272121935@qq.com","quanzhou722@163.com"]

title = ‘file check‘

 

DATE1=(datetime.datetime.now() + datetime.timedelta(days=-1) ).strftime(‘%Y%m%d‘)

file_path = ‘%s%s‘ %(PATH,DATE1)

 

def Ssh_Cmd(file_path,host_ip,user_name,user_pwd,port=22):

 

s = paramiko.SSHClient()

s.load_system_host_keys()

s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

 

try:

s.connect(hostname=host_ip,port=port,username=user_name,password=user_pwd)

stdin,stdout,stderr = s.exec_command(‘stat %s‘ %file_path)

stat_result = ‘%s%s‘ %(stdout.read(),stderr.read())

if stat_result.find(‘No such file or directory‘) == -1:

file_status = ‘OK\t‘

stdin,stdout,stderr = s.exec_command(‘du -sh %s‘ %file_path)

cmd1_result = ‘%s_%s‘ %(stat_result.split()[32],stat_result.split()[33].split(‘.‘)[0])

cmd2_result = (‘%s%s‘ %(stdout.read(),stderr.read())).split()[0] 

else:

file_status = ‘未生成\t‘

cmd1_result = ‘null‘

cmd2_result = ‘null‘

q.put([‘Login successful‘])

s.close()

except socket.error:

file_status = ‘主机或端口错误

cmd1_result = ‘-‘

cmd2_result = ‘-‘

except paramiko.AuthenticationException:

file_status = ‘用户或密码错误

cmd1_result = ‘-‘

cmd2_result = ‘-‘

except paramiko.BadHostKeyException:

file_status = ‘Bad host key‘

cmd1_result = ‘-‘

cmd2_result = ‘-‘

except:

file_status = ‘ssh异常

cmd1_result = ‘-‘

cmd2_result = ‘-‘

r.put(‘%s\t-\t%s\t%s\t%s\t%s\n‘ %(time.strftime(‘%Y-%m-%d_%H:%M‘),host_ip,file_status,cmd2_result,cmd1_result))

 

def Concurrent(Conf,file_path,user_name,user_pwd,port):

执行总计

total = 0

读取配置文件

f=open(Conf)

list = f.readlines()

f.close()

并发执行

process_list = []

log_file = file(‘file_check.log‘, ‘w‘)

log_file.write(‘检查时间\t\t业务\tIP\t\t文件状态\t大小\t生成时间\n‘) 

for host_info in list:

判断配置文件中注释行跳过

if host_info.startswith(‘#‘):

continue

取变量,其中任意变量未取到就跳过执行

try:

host_ip=host_info.split()[0].strip()

#user_name=host_info.split()[1]

#user_pwd=host_info.split()[2]

except:

log_file.write(‘Profile error: %s\n‘ %(host_info))

continue

#try:

# port=int(host_info.split()[3])

#except:

# port=22

total +=1

p = multiprocessing.Process(target=Ssh_Cmd,args=(file_path,host_ip,user_name,user_pwd,port))

p.start()

process_list.append(p)

for j in process_list:

j.join()

for j in process_list:

log_file.write(r.get())

 

successful = q.qsize()

log_file.write(‘执行完毕。 总执行:%s 登录成功:%s 登录失败:%s\n‘ %(total,successful,total - successful))

log_file.flush()

log_file.close()

 

def send_mail(to_list, sub):

me = mail_user + "<"+mail_user+"@"+mail_postfix+">"

fp = open(‘file_check.log‘)

msg = MIMEText(fp.read(),_charset="utf-8")

fp.close()

msg[‘Subject‘] = sub

msg[‘From‘] = me

msg[‘To‘] = ";".join(to_list)

try:

send_smtp = smtplib.SMTP()

send_smtp.connect(mail_host)

send_smtp.login(mail_user, mail_pass)

send_smtp.sendmail(me, to_list, msg.as_string())

send_smtp.close()

return True

except Exception, e:

print str(e)[1]

return False

 

if __name__ == ‘__main__‘:

q = multiprocessing.Queue()

r = multiprocessing.Queue()

Concurrent(Conf,file_path,user_name,user_pwd,port)

if send_mail(mailto_list,title):

print "发送成功"

else:

print "发送失败"

 

LazyManage并发批量操作(判断非root交互到root操作)

 

#!/usr/bin/python

#encoding:utf8

# LzayManage.py

# config file: serverlist.conf

 

import paramiko

import multiprocessing

import sys,os,time,socket,re

 

def Ssh_Cmd(host_ip,Cmd,user_name,user_pwd,port=22):

s = paramiko.SSHClient()

s.load_system_host_keys()

s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

s.connect(hostname=host_ip,port=port,username=user_name,password=user_pwd)

stdin,stdout,stderr = s.exec_command(Cmd)

Result = ‘%s%s‘ %(stdout.read(),stderr.read())

q.put(‘successful‘)

s.close()

return Result.strip()

 

def Ssh_Su_Cmd(host_ip,Cmd,user_name,user_pwd,root_name,root_pwd,port=22):

s = paramiko.SSHClient()

s.load_system_host_keys()

s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

s.connect(hostname=host_ip,port=port,username=user_name,password=user_pwd)

ssh = s.invoke_shell()

time.sleep(0.1)

ssh.send(‘su - %s\n‘ %(root_name))

buff = ‘‘

while not buff.endswith(‘Password: ‘):

resp = ssh.recv(9999)

buff +=resp

ssh.send(‘%s\n‘ %(root_pwd))

buff = ‘‘

while True:

resp = ssh.recv(9999)

buff +=resp

if ‘: incorrect password‘ in buff:

su_correct=‘passwd_error‘

break

elif buff.endswith(‘# ‘):

su_correct=‘passwd_correct‘

break

if su_correct == ‘passwd_correct‘:

ssh.send(‘%s\n‘ %(Cmd))

buff = ‘‘

while True:

resp = ssh.recv(9999)

if resp.endswith(‘# ‘):

buff +=re.sub(‘\[.*@.*\]# $‘,‘‘,resp)

break

buff +=resp

Result = buff.lstrip(‘%s‘ %(Cmd))

q.put(‘successful‘)

elif su_correct == ‘passwd_error‘:

Result = "\033[31mroot密码错误\033[m"

s.close()

return Result.strip()

 

def Send_File(host_ip,PathList,user_name,user_pwd,Remote=‘/tmp‘,port=22):

s=paramiko.Transport((host_ip,port))

s.connect(username=user_name,password=user_pwd)

sftp=paramiko.SFTPClient.from_transport(s) 

for InputPath in PathList:

LocalPath = re.sub(‘^\./‘,‘‘,InputPath.rstrip(‘/‘))

RemotePath = ‘%s/%s‘ %( Remote , os.path.basename( LocalPath ))

try:

sftp.rmdir(RemotePath)

except:

pass

try:

sftp.remove(RemotePath)

except:

pass

if os.path.isdir(LocalPath):

sftp.mkdir(RemotePath)

for path,dirs,files in os.walk(LocalPath):

for dir in dirs:

dir_path = os.path.join(path,dir)

sftp.mkdir(‘%s/%s‘ %(RemotePath,re.sub(‘^%s/‘ %LocalPath,‘‘,dir_path)))

for file in files:

file_path = os.path.join(path,file)

sftp.put( file_path,‘%s/%s‘ %(RemotePath,re.sub(‘^%s/‘ %LocalPath,‘‘,file_path)))

else:

sftp.put(LocalPath,RemotePath)

q.put(‘successful‘)

sftp.close()

s.close()

Result = ‘%s  \033[32m传送完成\033[m‘ % PathList

return Result

 

def Ssh(host_ip,Operation,user_name,user_pwd,root_name,root_pwd,Cmd=None,PathList=None,port=22):

msg = "\033[32m-----------Result:%s----------\033[m" % host_ip

try:

if Operation == ‘Ssh_Cmd‘:

Result = Ssh_Cmd(host_ip=host_ip,Cmd=Cmd,user_name=user_name,user_pwd=user_pwd,port=port)

elif Operation == ‘Ssh_Su_Cmd‘:

Result = Ssh_Su_Cmd(host_ip=host_ip,Cmd=Cmd,user_name=user_name,user_pwd=user_pwd,root_name=root_name,root_pwd=root_pwd,port=port)

elif Operation == ‘Ssh_Script‘:

Send_File(host_ip=host_ip,PathList=PathList,user_name=user_name,user_pwd=user_pwd,port=port)

Script_Head = open(PathList[0]).readline().strip()

LocalPath = re.sub(‘^\./‘,‘‘,PathList[0].rstrip(‘/‘))

Cmd = ‘%s /tmp/%s‘ %( re.sub(‘^#!‘,‘‘,Script_Head), os.path.basename( LocalPath ))

Result = Ssh_Cmd(host_ip=host_ip,Cmd=Cmd,user_name=user_name,user_pwd=user_pwd,port=port)

elif Operation == ‘Ssh_Su_Script‘:

Send_File(host_ip=host_ip,PathList=PathList,user_name=user_name,user_pwd=user_pwd,port=port)

Script_Head = open(PathList[0]).readline().strip()

LocalPath = re.sub(‘^\./‘,‘‘,PathList[0].rstrip(‘/‘))

Cmd = ‘%s /tmp/%s‘ %( re.sub(‘^#!‘,‘‘,Script_Head), os.path.basename( LocalPath ))

Result = Ssh_Su_Cmd(host_ip=host_ip,Cmd=Cmd,user_name=user_name,user_pwd=user_pwd,root_name=root_name,root_pwd=root_pwd,port=port)

elif Operation == ‘Send_File‘:

Result = Send_File(host_ip=host_ip,PathList=PathList,user_name=user_name,user_pwd=user_pwd,port=port)

else:

Result = ‘操作不存在

 

except socket.error:

Result = ‘\033[31m主机或端口错误\033[m‘

except paramiko.AuthenticationException:

Result = ‘\033[31m用户名或密码错误\033[m‘

except paramiko.BadHostKeyException:

Result = ‘\033[31mBad host key\033[m[‘

except IOError:

Result = ‘\033[31m远程主机已存在非空目录或没有写权限\033[m‘

except:

Result = ‘\033[31m未知错误\033[m‘

r.put(‘%s\n%s\n‘ %(msg,Result))

 

def Concurrent(Conf,Operation,user_name,user_pwd,root_name,root_pwd,Cmd=None,PathList=None,port=22):

读取配置文件

f=open(Conf)

list = f.readlines()

f.close()

执行总计

total = 0

并发执行

for host_info in list:

判断配置文件中注释行跳过

if host_info.startswith(‘#‘):

continue

取变量,其中任意变量未取到就跳过执行

try:

host_ip=host_info.split()[0]

#user_name=host_info.split()[1]

#user_pwd=host_info.split()[2]

except:

print(‘Profile error: %s‘ %(host_info) )

continue

try:

port=int(host_info.split()[3])

except:

port=22

total +=1

p = multiprocessing.Process(target=Ssh,args=(host_ip,Operation,user_name,user_pwd,root_name,root_pwd,Cmd,PathList,port))

p.start()

打印执行结果

for j in range(total):

print(r.get() )

if Operation == ‘Ssh_Script‘ or Operation == ‘Ssh_Su_Script‘:

successful = q.qsize() / 2

else:

successful = q.qsize()

print(‘\033[32m执行完毕[总执行:%s 成功:%s 失败:%s]\033[m‘ %(total,successful,total - successful) )

q.close()

r.close()

 

def Help():

print(‘‘‘ 1.执行命令

2.执行脚本      \033[32m[位置1脚本(必须带脚本头),后可带执行脚本所需要的包\文件\文件夹路径,空格分隔]\033[m

3.发送文件      \033[32m[传送的包\文件\文件夹路径,空格分隔]\033[m

退出: 0\exit\quit

帮助: help\h\?

注意发送文件默认为/tmp,如已存在同名文件会被强制覆盖,非空目录则中断操作.执行脚本先将本地脚本及包发送远程主机上,发送规则同发送文件

‘‘‘)

 

if __name__==‘__main__‘:

定义root账号信息

root_name = ‘root‘

root_pwd = ‘peterli‘

user_name=‘peterli‘

user_pwd=‘<++(3Ie‘

配置文件

Conf=‘serverlist.conf‘

if not os.path.isfile(Conf):

print(‘\033[33m配置文件 %s 不存在\033[m‘ %(Conf) )

sys.exit()

Help()

while True:

i = raw_input("\033[35m[请选择操作]: \033[m").strip()

q = multiprocessing.Queue()

r = multiprocessing.Queue()

if i == ‘1‘:

if user_name == root_name:

Operation = ‘Ssh_Cmd‘

else:

Operation = ‘Ssh_Su_Cmd‘

Cmd = raw_input(‘CMD: ‘).strip()

if len(Cmd) == 0:

print(‘\033[33m命令为空\033[m‘)

continue

Concurrent(Conf=Conf,Operation=Operation,user_name=user_name,user_pwd=user_pwd,root_name=root_name,root_pwd=root_pwd,Cmd=Cmd)

elif i == ‘2‘:

if user_name == root_name:

Operation = ‘Ssh_Script‘

else:

Operation = ‘Ssh_Su_Script‘

PathList = raw_input(‘\033[36m本地脚本路径: \033[m‘).strip().split()

if len(PathList) == 0:

print(‘\033[33m路径为空\033[m‘)

continue

if not os.path.isfile(PathList[0]):

print(‘\033[33m本地路径 %s 不存在或不是文件\033[m‘ %(PathList[0]) )

continue

for LocalPath in PathList[1:]:

if not os.path.exists(LocalPath):

print(‘\033[33m本地路径 %s 不存在\033[m‘ %(LocalPath) )

break

else:

Concurrent(Conf=Conf,Operation=Operation,user_name=user_name,user_pwd=user_pwd,root_name=root_name,root_pwd=root_pwd,PathList=PathList)

elif i == ‘3‘:

Operation = ‘Send_File‘

PathList = raw_input(‘\033[36m本地路径: \033[m‘).strip().split()

if len(PathList) == 0:

print(‘\033[33m路径为空\033[m‘)

continue

for LocalPath in PathList:

if not os.path.exists(LocalPath):

print(‘\033[33m本地路径 %s 不存在\033[m‘ %(LocalPath) )

break

else:

Concurrent(Conf=Conf,Operation=Operation,user_name=user_name,user_pwd=user_pwd,root_name=root_name,root_pwd=root_pwd,PathList=PathList)

elif i == ‘0‘ or i == ‘exit‘ or i == ‘quit‘:

print("\033[34m退出LazyManage脚本\033[m")

sys.exit()

elif i == ‘help‘ or i == ‘h‘ or i == ‘?‘:

Help()

 

urllib2 [网络资源访问]

 

import urllib2

response = urllib2.urlopen(‘http://baidu.com‘)

print response.geturl()       # url

headers = response.info()

print headers                 # web页面头部信息

print headers[‘date‘]         # 头部信息中的时间

date = response.read()        # 返回页面所有信息[字符串]

# date = response.readlines() # 返回页面所有信息[列表]

 

for i in urllib2.urlopen(‘http://qq.com‘):    # 可直接迭代

print i,

 

下载文件

 

#!/usr/bin/env python

#encoding:utf8

import urllib2

 

url = ‘http://www.01happy.com/wp-content/uploads/2012/09/bg.png‘

file("./pic/%04d.png" % i, "wb").write(urllib2.urlopen(url).read())

 

模拟浏览器访问web页面 python2

 

#!/usr/bin/env python

 

import urllib2,random

 

url="http://pythontab.com"

 

num = random.randint(1,3)

if num == 1:

browser=‘AppleWebKit/537.11 (KHTML, like Gecko)‘

elif num == 2:

browser=‘Chrome/23.0.1271.64 Safari/537.11‘

elif num == 3:

browser=‘Mozilla/5.0 (Windows NT 6.1)‘

 

req_header = {‘User-Agent‘:browser,

‘Accept‘:‘text/html;q=0.9,*/*;q=0.8‘,

‘Accept-Charset‘:‘ISO-8859-1,utf-8;q=0.7,*;q=0.3‘,

‘Connection‘:‘close‘,

‘Referer‘:None

}

 

req_timeout = 5

req = urllib2.Request(url,None,req_header)

resp = urllib2.urlopen(req,None,req_timeout)

html = resp.read()

print(html)

 

模拟浏览器访问web页面 python3

#! /usr/bin/env python

# -*- coding=utf-8 -*- 

import urllib.request

 

url = "http://www.baidu.com"

# AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11

headers = {‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1)‘,

‘Accept‘:‘text/html;q=0.9,*/*;q=0.8‘,

‘Accept-Charset‘:‘ISO-8859-1,utf-8;q=0.7,*;q=0.3‘,

‘Connection‘:‘close‘,

‘Referer‘:None #注意如果依然不能抓取的话,这里可以设置抓取网站的host

}

 

opener = urllib.request.build_opener()

opener.addheaders = [headers]

data = opener.open(url).read()

 

print(data)

 

requests [提交网页请求]

 

#Requests是一个PythonHTTP客户端库

#安装: sudo pip install requests

import requests

r = requests.get(‘http://baidu.com‘)

#r = requests.get(‘https://baidu.com‘, auth=(‘user‘, ‘pass‘))   # https需登录加auth

r.status_code                  # 状态码

r.headers                      # 网页头信息

r.headers[‘content-type‘]      # 网页头信息

r.headers[‘content-length‘]    # 网页头信息

r.text                         # 网页源码

r.content                      # 网页源码

 

import requests

Ip=‘211.211.54.54‘

QueryAdd=‘http://www.anti-spam.org.cn/Rbl/Query/Result‘

results = requests.post(url=QueryAdd, data={‘IP‘:Ip})        # post方法提交表单

 

url = r‘http://dict.youdao.com/search?le=eng&q={0}‘.format(word.strip())

results = requests.get(url)                                  # get方法提交表单

 

if r.ok:    # 判断请求是否正常

# results 可使用 BeautifulSoup4 解析处理判定结果

print results.content   # 获取到的原始内容

print results.text      # 把原始内容转unicode编码

 

BeautifulSoup [html\xml解析器]

 

# BeautifulSoup中文官方文档

# http://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html

# http://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

 

导入模块

from BeautifulSoup import BeautifulSoup          # For processing HTML  版本3.0 已停止更新

from BeautifulSoup import BeautifulStoneSoup     # For processing XML

import BeautifulSoup                             # To get everything

from bs4 import BeautifulSoup                    # 版本4.0 bs4 安装: pip install BeautifulSoup4

 

from bs4 import BeautifulSoup

soup = BeautifulSoup(html_doc)    # 解析html文本 可以是 requests 提交返回的页面 results.content

print(soup.prettify())            # 输出解析后的结构

print(soup.title)                 # 指定标签内容

print(soup.title.name)            # 标签名

print(soup.title.string)          # 标签内容

print(soup.title.parent.name)     # 上层标签名

print(soup.p)                     # <p class="title"><b>The Dormouse‘s story</b></p>

print(soup.p[‘class‘])            # u‘title‘  class属性值

print(soup.a)                     # 找到第一个a标签的标签行

print(soup.find_all(‘a‘,limit=2)) # 找到a标签的行,最多为limit

print(soup.find(id="link3"))      # 标签内idlink3的标签行

print(soup.get_text())            # 从文档中获取所有文字内容

soup.find_all("a", text="Elsie")  # 从文档中搜索关键字

soup.find(text=re.compile("sisters"))  # 从文档中正则搜索关键字

soup.find_all("a", class_="sister")    # CSS搜索

soup.find_all(id=‘link2‘,"table",attrs={"class": "status"},href=re.compile("elsie"))   # 搜索方法

for link in soup.find_all(‘a‘):   # 循环所有a标签的标签行

print(link.get(‘href‘))       # 取出当前a标签中的连接

 

cookielib [保留cookie登录页面]

 

ck = cookielib.CookieJar()   # 通过 这个就可以实现请求带过去的COOKIE与发送回来的COOKIE值了。

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(ck))   # 获取到COOKIE

urllib2.install_opener(opener)   # 此句设置urllib2的全局opener

content = urllib2.urlopen(url).read()  

 

登录cacti取图片

#encoding:utf8

import urllib2

import urllib

import cookielib

def renrenBrower(url,user,password):

#查找form标签中的action提交地址

login_page = "http://10.10.76.79:81/cacti/index.php"

try:

#获得一个cookieJar实例

cj = cookielib.CookieJar()

#cookieJar作为参数,获得一个opener的实例

opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

#伪装成一个正常的浏览器,避免有些web服务器拒绝访问

opener.addheaders = [(‘User-agent‘,‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)‘)]

#生成Post数据,含有登陆用户名密码,所有表单内的inputname

data = urllib.urlencode({"action":"login","login_username":user,"login_password":password})

#post的方法访问登陆页面,访问之后cookieJar会自定保存cookie

opener.open(login_page,data)

#以带cookie的方式访问页面

op=opener.open(url)

#读取页面源码

data=op.read()

#将图片写到本地

#file("1d.png" , "wb").write(data)

return data

except Exception,e:

print str(e)

print renrenBrower("http://10.10.76.79:81/cacti/graph_image.php?local_graph_id=1630&rra_id=0&view_type=tree&graph_start=1397525517&graph_end=1397611917","admin","admin")

 

例子2

import urllib, urllib2, cookielib  

import os, time  

  

headers = []  

  

def login():  

cj = cookielib.CookieJar()  

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))  

login_url = r‘http://zhixing.bjtu.edu.cn/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1‘  

login_data = urllib.urlencode({‘cookietime‘: ‘2592000‘, ‘handlekey‘: ‘ls‘, ‘password‘: ‘xxx‘,  

‘quickforward‘: ‘yes‘, ‘username‘: ‘GuoYuan‘})  

opener.addheaders = [(‘Host‘, ‘zhixing.bjtu.edu.cn‘),  

   (‘User-Agent‘, ‘Mozilla/5.0 (Ubuntu; X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0‘),  

   (‘Accept‘, ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘),  

   (‘Accept-Language‘, ‘en-us,en;q=0.5‘),  

   (‘Accept-Encoding‘, ‘gzip, deflate‘),  

   (‘Accept-Charset‘, ‘ISO-8859-1,utf-8;q=0.7,*;q=0.7‘),  

   (‘Connection‘, ‘keep-alive‘),  

   (‘Referer‘, ‘http://zhixing.bjtu.edu.cn/forum.php‘),]  

opener.open(login_url, login_data)  

return opener  

  

if __name__ == ‘__main__‘:  

opener = login()  

  

url = r‘http://zhixing.bjtu.edu.cn/forum.php?mod=topicadmin&action=moderate&optgroup=2&modsubmit=yes&infloat=yes&inajax=1‘      

data = {‘fid‘: ‘601‘, ‘formhash‘: ‘0cdd1596‘, ‘frommodcp‘: ‘‘, ‘handlekey‘: ‘mods‘,  

 ‘listextra‘: ‘page%3D62‘, ‘moderate[]‘: ‘496146‘, ‘operations[]‘: ‘type‘, ‘reason‘: ‘...‘,  

 ‘redirect‘: r‘http://zhixing.bjtu.edu.cn/thread-496146-1-1.html‘, ‘typeid‘: ‘779‘}  

data2 = [(k, v) for k,v in data.iteritems()]  

  

cnt = 0  

for tid in range(493022, 496146 + 1):  

cnt += 1  

if cnt % 20 == 0: print  

print tid,  

  

data2.append((‘moderate[]‘, str(tid)))  

if cnt % 40 == 0 or cnt == 496146:  

request = urllib2.Request(url=url, data=urllib.urlencode(data2))  

print opener.open(request).read()  

data2 = [(k, v) for k,v in data.iteritems()]  

 

httplib [http协议的客户端]

import httplib

conn3 = httplib.HTTPConnection(‘www.baidu.com‘,80,True,10) 

 

读取网页指定内容

 

#读取整个网页,正则截取匹配信息

#!/usr/bin/env python

#encoding=utf-8

import  re, urllib,datetime

def getPageCode(url, fromCharset, toCharset):

fr = urllib.urlopen(url)

pageCode = fr.read()

fr.close()

return pageCode

def getImgUrl(pageCode):

pattern = re.compile(r‘(\d*\-\d*\-\d* \d*:\d*:\d*)‘)

return  re.findall(pattern, pageCode)

 

if __name__ == ‘__main__‘:

f = file(‘url.conf‘)

c = f.readlines()

f.close()

for url in c:

pageCode = getPageCode(url.rstrip(), ‘gb2312‘, ‘utf8‘)

imgUrl = getImgUrl(pageCode)

print imgUrl

 

读取网页图片大小

 

根据http,得到content-type的值

#!/usr/bin/env python

#encoding=utf-8

import urllib2

url = ‘http://www.01happy.com/wp-content/uploads/2012/09/bg.png‘

reqst = urllib2.Request(url)

opener = urllib2.build_opener()

con = opener.open(reqst)

Type = con.headers.dict[‘content-type‘][:5]

Length = int(con.headers.dict[‘content-length‘])

if Length > 0:

print(Length)

print(Type)

 

查看网页图片尺寸类型

 

#将图片读入内存

#!/usr/bin/env python

#encoding=utf-8

import cStringIO, urllib2, Image

url = ‘http://www.01happy.com/wp-content/uploads/2012/09/bg.png‘

file = urllib2.urlopen(url)

tmpIm = cStringIO.StringIO(file.read())

im = Image.open(tmpIm)

print im.format, im.size, im.mode

 

爬虫

 

#!/usr/bin/env python

#encoding:utf-8

#sudo pip install BeautifulSoup

 

import requests

from BeautifulSoup import BeautifulSoup

import re

 

baseurl = ‘http://blog.sina.com.cn/s/articlelist_1191258123_0_1.html‘

 

r = requests.get(baseurl)

 

for url in re.findall(‘<a.*?</a>‘, r.content, re.S):

if url.startswith(‘<a title=‘):

with open(r‘d:/final.txt‘, ‘ab‘) as f:

f.write(url + ‘\n‘)

 

linkfile = open(r‘d:/final.txt‘, ‘rb‘)

soup = BeautifulSoup(linkfile)

for link in soup.findAll(‘a‘):

#print link.get(‘title‘) + ‘:    ‘ + link.get(‘href‘)

ss = requests.get(link.get(‘href‘))

for content in re.findall(‘<div id="sina_keyword_ad_area2" class="articalContent  ">.*?</div>‘, ss.content, re.S):

with open(r‘d:/myftp/%s.txt‘%link.get(‘title‘).strip(‘<>‘), ‘wb‘) as f:

f.write(content)

print ‘%s   has been copied.‘ % link.get(‘title‘)

 

反垃圾邮件提交申诉

 

#很遗憾,反垃圾邮件联盟改版后加了验证码

 

#!/usr/bin/env python

#encoding:utf-8

import requests

import re

 

IpList=[‘113.212.91.25‘,‘113.212.91.23‘]

QueryAdd=‘http://www.anti-spam.org.cn/Rbl/Query/Result‘

ComplaintAdd=‘http://www.anti-spam.org.cn/Rbl/Getout/Submit‘

data = {

‘CONTENT‘:‘‘‘我们是一家正规的XXXxxxxxxx。恳请将我们的发送服务器IP移出黑名单。谢谢!

处理措施:

1.XXXX

2.XXXX‘‘‘,

‘CORP‘:‘abc.com‘,

‘WWW‘:‘www.abc.cm‘,

‘NAME‘:‘def‘,

‘MAIL‘:‘def@163.com.cn‘,

‘TEL‘:‘010-50000000‘,

‘LEVEL‘:‘0‘,

}

 

for Ip in IpList:

query = requests.post(url=QueryAdd, data={‘IP‘:Ip})                   # 黑名单查询

if query.ok:

if re.findall(u‘\u7533\u8bc9\u8131\u79bb‘, query.text, re.S):     # 查找关键字 申诉脱离 既表明在黑名单中

data[‘IP‘]=Ip

complaint = requests.post(url=ComplaintAdd, data=data)        # 提交申诉

if complaint.ok:

if re.findall(u‘\u60a8\u7684\u9ed1\u540d\u5355\u8131\u79bb\u7533\u8bf7\u5df2\u63d0\u4ea4‘, complaint.text, re.S):

status=‘申请提交

elif re.findall(u‘\u8131\u79bb\u7533\u8bf7\u5df2\u88ab\u4ed6\u4eba\u63d0\u4ea4‘, complaint.text, re.S):

status=‘重复提交

elif re.findall(u‘\u7533\u8bf7\u7531\u4e8e\u8fd1\u671f\u5185\u6709\u88ab\u62d2\u7edd\u7684\u8bb0\u5f55‘, complaint.text, re.S):

status=‘近期拒绝

else:

status=‘异常

else:

status=‘正常

print ‘%s  %s‘ %(Ip,status)

 

有道词典

 

#!/usr/bin/env python

import requests

from bs4 import BeautifulSoup

# bs4安装: pip install BeautifulSoup4

 

def youdao(word):

url = r‘http://dict.youdao.com/search?le=eng&q={0}‘.format(word.strip())

r = requests.get(url)

if r.ok:

soup = BeautifulSoup(r.content)

div = soup.find_all(‘div‘, class_=‘trans-container‘)[:1]    # find_allbs4的方法

ul = BeautifulSoup(str(div[0]))

li = ul.find_all(‘li‘)

for mean in li:

print mean.text

 

def query():

print(‘Created by @littlepy, QQ:185635687‘)

while True:

word = raw_input(‘>>>‘)

youdao(word)

 

if __name__ == ‘__main__‘:

query()

 

并发

 

#线程安全/竞争条件,/死锁检测,同步/异步,阻塞/非阻塞,epoll非阻塞IO,信号量/事件,线程池,生产消费模型,伪并发,微线程,协程

#Stackless Python Python编程语言的一个增强版本,它使程序员从基于线程的编程方式中获得好处,并避免传统线程所带来的性能与复杂度问题。Stackless为 Python带来的微线程扩展,是一种低开销、轻量级的便利工具

 

threading多线程

 

thread

start_new_thread(function,args kwargs=None)    # 产生一个新的线程

allocate_lock()                                # 分配一个LockType类型的锁对象

exit()                                         # 让线程退出

acquire(wait=None)                             # 尝试获取锁对象

locked()                                       # 如果获取了锁对象返回True

release()                                      # 释放锁

 

thread例子

 

#!/usr/bin/env python

#thread_test.py

#不支持守护进程

import thread

from time import sleep,ctime

 

loops = [4,2]

 

def loop(nloop,nsec,lock):

print ‘start loop %s at:%s‘ % (nloop,ctime())

sleep(nsec)

print ‘loop %s done at: %s‘ % (nloop, ctime())

lock.release()              # 分配已获得的锁,操作结束后释放相应的锁通知主线程

 

def main():

print ‘starting at:‘,ctime()

locks = []

nloops = range(len(loops))

 

for i in nloops:

lock = thread.allocate_lock()     # 创建一个锁

lock.acquire()                    # 调用各个锁的acquire()函数获得锁

locks.append(lock)                # 把锁放到锁列表locks

for i in nloops:

thread.start_new_thread(loop,(i,loops[i],locks[i]))   # 创建线程

for i in nloops:

while locks[i].locked():pass      # 等待全部解锁才继续运行

print ‘all DONE at:‘,ctime()

 

if __name__ == ‘__main__‘:

main()

 

threading

Thread                   # 表示一个线程的执行的对象

start()              # 开始线程的执行

run()                # 定义线程的功能的函数(一般会被子类重写)

join(timeout=None)   # 允许主线程等待线程结束,程序挂起,直到线程结束;如果给了timeout,则最多等待timeout.

getName()            # 返回线程的名字

setName(name)        # 设置线程的名字

isAlive()            # 布尔标志,表示这个线程是否还在运行中

isDaemon()           # 返回线程的daemon标志

setDaemon(daemonic)  # 后台线程,把线程的daemon标志设置为daemonic(一定要在调用start()函数前调用)

默认主线程在退出时会等待所有子线程的结束。如果希望主线程不等待子线程,而是在退出时自动结束所有的子线程,就需要设置子线程为后台线程(daemon)

Lock              # 锁原语对象

Rlock             # 可重入锁对象.使单线程可以在此获得已获得了的锁(递归锁定)

Condition         # 条件变量对象能让一个线程停下来,等待其他线程满足了某个条件.如状态改变或值的改变

Event             # 通用的条件变量.多个线程可以等待某个事件的发生,在事件发生后,所有的线程都会被激活

Semaphore         # 为等待锁的线程提供一个类似等候室的结构

BoundedSemaphore  # Semaphore类似,只是不允许超过初始值

Time              # Thread相似,只是他要等待一段时间后才开始运行

activeCount()     # 当前活动的线程对象的数量

currentThread()   # 返回当前线程对象

enumerate()       # 返回当前活动线程的列表

settrace(func)    # 为所有线程设置一个跟踪函数

setprofile(func)  # 为所有线程设置一个profile函数

 

threading例子1

 

#!/usr/bin/env python

#encoding:utf8

import threading

from Queue import Queue

from time import sleep,ctime

 

class ThreadFunc(object):

def __init__(self,func,args,name=‘‘):

self.name=name

self.func=func                    # loop

self.args=args                    # (i,iplist[i],queue)

def __call__(self):

apply(self.func,self.args)        # 函数apply() 执行loop函数并传递元组参数

def loop(nloop,ip,queue):

print ‘start‘,nloop,‘at:‘,ctime()

queue.put(ip)

sleep(2)

print ‘loop‘,nloop,‘done at:‘,ctime()

if __name__ == ‘__main__‘:

threads = []

queue = Queue()

iplist = [‘192.168.1.2‘,‘192.168.1.3‘,‘192.168.1.4‘,‘192.168.1.5‘,‘192.168.1.6‘,‘192.168.1.7‘,‘192.168.1.8‘]

nloops = range(len(iplist))

 

for i in nloops:

t = threading.Thread(target=ThreadFunc(loop,(i,iplist[i],queue),loop.__name__))

threads.append(t)

for i in nloops:

threads[i].start()

for i in nloops:

threads[i].join()

for i in nloops:

print queue.get()

 

threading例子2

 

#!/usr/bin/env python

#encoding:utf8

from Queue import Queue

import random,time,threading

 

class Producer(threading.Thread):

def __init__(self, t_name, queue):

threading.Thread.__init__(self, name=t_name)

self.data=queue

def run(self):

for i in range(5):

print "%s: %s is producing %d to the queue!\n" %(time.ctime(), self.getName(), i)

self.data.put(i)

self.data.put(i*i)

time.sleep(2)

print "%s: %s finished!" %(time.ctime(), self.getName())

 

class Consumer(threading.Thread):

def __init__(self, t_name, queue):

threading.Thread.__init__(self, name=t_name)

self.data=queue

def run(self):

for i in range(10):

val = self.data.get()

print "%s: %s is consuming. %d in the queue is consumed!\n" %(time.ctime(), self.getName(), val)

print "%s: %s finished!" %(time.ctime(), self.getName())

 

if __name__ == ‘__main__‘:

queue = Queue()

producer = Producer(‘Pro.‘, queue)

consumer = Consumer(‘Con.‘, queue)

producer.start()

consumer.start()

producer.join()

consumer.join()

 

后台线程

 

import threading

import time,random

 

class MyThread(threading.Thread):

def run(self):

wait_time=random.randrange(1,10)

print "%s will wait %d seconds" % (self.name, wait_time)

time.sleep(wait_time)

print "%s finished!" % self.name

 

if __name__=="__main__":

for i in range(5):

t = MyThread()

t.setDaemon(True)    # 设置为后台线程,主线程完成时不等待子线程完成就结束

t.start()

 

threading控制最大并发_查询日志中IP信息

 

#!/usr/bin/env python

#coding:utf-8

import urllib2

import json

import threading

import time

 

‘‘‘

by:某大牛

QQ:185635687

这个是多线程并发控制如果要改成多进程,只需把threading 换成 mulitprocessing.Process , 对, 就是换个名字而已.

‘‘‘

 

#获取ip 及其出现次数

def ip_dic(file_obj, dic):

for i in file_obj:

if i:

ip=i.split(‘-‘)[0].strip()

if ip in dic.keys():

dic[ip]=dic[ip] + 1

else:

dic[ip]=1

return dic.iteritems()

 

#目标函数

def get_data(url, ipcounts):

data=urllib2.urlopen(url).read()

datadict=json.loads(data)

fdata = u"ip:%s---%s,%s,%s,%s,%s" %(datadict["data"]["ip"],ipcounts,datadict["data"]["country"],datadict["data"]["region"],datadict["data"]["city"],datadict["data"]["isp"])

print fdata

 

#多线程

def threads(iters):

thread_pool = []

for k in iters:

url = "http://ip.taobao.com/service/getIpInfo.php?ip="

ipcounts = k[1]

url = (url + k[0]).strip()

t = threading.Thread(target=get_data, args=(url, ipcounts))

thread_pool.append(t)

return thread_pool

 

#控制多线程

def startt(t_list, max,second):

l = len(t_list)

n = max

while l > 0:

if l > max:

nl = t_list[:max]

t_list = t_list[max:]

for t in nl:

t.start()

time.sleep(second)

for t in nl:

t.join()

print ‘*‘*15,  str(n)+ ‘ ip has been queried‘+‘*‘*15

n += max

l = len(t_list)

continue

elif l <= max:

nl = t_list

for t in nl:

t.start()

for t in nl:

t.join()

print ‘>>> Totally ‘ + str(n+l ) + ‘ ip has been queried‘

l = 0

 

if __name__ =="__main__":

dic={}

with open(‘access.log‘) as file_obj:

it = ip_dic(file_obj, dic)

t_list= threads(it)

startt(t_list, 15, 1)

 

Queue通用队列

 

q=Queue(size)       # 创建大小sizeQueue对象

qsize()             # 返回队列的大小(返回时候,可能被其他进程修改,近似值)

empty()             # 如果队列为空返回True,否则Fales

full()              # 如果队列已满返回True,否则Fales

put(item,block0)    # item放到队列中,如果给了block(不为0),函数会一直阻塞到队列中有空间为止

get(block=0)        # 从队列中取一个对象,如果给了block(不为0),函数会一直阻塞到队列中有对象为止

get_nowait          # 默认get阻塞,这个不阻塞

 

multiprocessing [多进程并发]

 

多进程并发

 

#!/usr/bin/env python

#encoding:utf8

from multiprocessing import Process

import time,os

def f(name):

time.sleep(1)

print ‘hello ‘,name

print os.getppid()   # 取得父进程ID

print os.getpid()    # 取得进程ID

process_list = []

 

for i in range(10):

p = Process(target=f,args=(i,))

p.start()

process_list.append(p)

for j in process_list:

j.join()

 

Queue进程间通信

 

from multiprocessing import Process,Queue

import time

def f(name):

time.sleep(1)

q.put([‘hello‘+str(name)])

process_list = []

q = Queue()

if __name__ == ‘__main__‘:

for i in range(10):

p = Process(target=f,args=(i,))

p.start()

process_list.append(p)

for j in process_list:

j.join()

for i in range(10):

print q.get()

 

Pipe管道

 

from multiprocessing import Process,Pipe

import time

import os

 

def f(conn,name):

time.sleep(1)

conn.send([‘hello‘+str(name)])

print os.getppid(),‘-----------‘,os.getpid()

process_list = []

parent_conn,child_conn = Pipe()

if __name__ == ‘__main__‘:

for i in range(10):

p = Process(target=f,args=(child_conn,i))

p.start()

process_list.append(p)

for j in process_list:

j.join()

for p in range(10):

print parent_conn.recv()

 

进程间同步

#加锁,使某一时刻只有一个进程 print

from multiprocessing import Process,Lock

import time

import os

 

def f(name):

lock.acquire()

time.sleep(1)

print ‘hello--‘+str(name)

print os.getppid(),‘-----------‘,os.getpid()

lock.release()

process_list = []

lock = Lock()

if __name__ == ‘__main__‘:

for i in range(10):

p = Process(target=f,args=(i,))

p.start()

process_list.append(p)

for j in process_list:

j.join()

 

共享内存

 

通过使用Value或者Array把数据存储在一个共享的内存表中

# ‘d‘‘i‘参数是numarr用来设置类型,d表示一个双精浮点类型,i表示一个带符号的整型。

from multiprocessing import Process,Value,Array

import time

import os

 

def f(n,a,name):

time.sleep(1)

n.value = name * name

for i in range(len(a)):

a[i] = -i

process_list = []

if __name__ == ‘__main__‘:

num = Value(‘d‘,0.0)

arr = Array(‘i‘,range(10))

for i in range(10):

p = Process(target=f,args=(num,arr,i))

p.start()

process_list.append(p)

for j in process_list:

j.join()

print num.value

print arr[:]

 

manager

 

比共享内存灵活,但缓慢

支持list,dict,Namespace,Lock,Semaphore,BoundedSemaphore,Condition,Event,Queue,alue,Array

from multiprocessing import Process,Manager

import time

import os

 

def f(d,name):

time.sleep(1)

d[name] = name * name

print d

process_list = []

if __name__ == ‘__main__‘:

manager = Manager()

d = manager.dict()

for i in range(10):

p = Process(target=f,args=(d,i))

p.start()

process_list.append(p)

for j in process_list:

j.join()

print d

 

最大并发数

 

import multiprocessing

import time,os

 

result = []

def run(h):

print ‘threading:‘ ,h,os.getpid()

p = multiprocessing.Pool(processes=20)

 

for i in range(100):

result.append(p.apply_async(run,(i,)))

p.close()

 

for res in result:

res.get(timeout=5)

 

twisted  [非阻塞异步服务器框架]

 

用来进行网络服务和应用程序的编程。虽然 Twisted Matrix 中有大量松散耦合的模块化组件,但该框架的中心概念还是非阻塞异步服务器这一思想。对于习惯于线程技术或分叉服务器的开发人员来说,这是一种新颖的编程风格,但它却能在繁重负载的情况下带来极高的效率。

pip install twisted

 

greenlet [微线程/协程框架]

 

更加原始的微线程的概念,没有调度,或者叫做协程。这在你需要控制你的代码时很有用。你可以自己构造微线程的 调度器;也可以使用"greenlet"实现高级的控制流。例如可以重新创建构造器;不同于Python的构造器,我们的构造器可以嵌套的调用函数,而被嵌套的函数也可以 yield 一个值。

pip install greenlet

 

tornado  [极轻量级Web服务器框架

 

高可伸缩性和epoll非阻塞IO,响应快速,可处理数千并发连接,特别适用用于实时的Web服务

pip install tornado

 

Scrapy   [web抓取框架]

Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

 

算法 

 

斐波那契

#将函数结果作为列表可用于循环

def fab(max): 

n, a, b = 0, 0, 1 

while n < max: 

yield b         

a, b = b, a + b 

n = n + 1 

for n in fab(5): 

print n

 

乘法口诀

 

#!/usr/bin/python

for i in range(1,10):

for j in range(1,i+1):

print j,‘*‘,i,‘=‘,j*i,

else:

print ‘‘

 

最小公倍数

 

# 1-70的最小公倍数

def c(m,n):

a1=m

b1=n

r=n%m

while r!=0:

n=m

m=r

r=n%m

return (a1*b1)/m

d=1

for i in range(3,71,2):

d = c(d,i)

print d

 

排序算法

 

插入排序

def insertion_sort(sort_list):

iter_len = len(sort_list)

if iter_len < 2:

return sort_list

for i in range(1, iter_len):

key = sort_list[i]

j = i - 1

while j>=0 and sort_list[j]>key:

sort_list[j+1] = sort_list[j]

j -= 1

sort_list[j+1] = key

return sort_list

 

选择排序

def selection_sort(sort_list):

iter_len = len(sort_list)

if iter_len < 2:

return sort_list

for i in range(iter_len-1):

smallest = sort_list[i]

location = i

for j in range(i, iter_len):

if sort_list[j] < smallest:

smallest = sort_list[j]

location = j

if i != location:

sort_list[i], sort_list[location] = sort_list[location], sort_list[i]

return sort_list

 

冒泡排序算法

def bubblesort(numbers):

for j in range(len(numbers)-1,-1,-1):

for i in range(j):

if numbers[i]>numbers[i+1]:

numbers[i],numbers[i+1] = numbers[i+1],numbers[i]

print(i,j)

print(numbers)

 

10 例子

 

PIL图像处理

 

import Image

im = Image.open("j.jpg")            # 打开图片

print im.format, im.size, im.mode   # 打印图像格式、像素宽和高、模式

# JPEG (440, 330) RGB

im.show()                           # 显示最新加载图像

box = (100, 100, 200, 200)

region = im.crop(box)               # 从图像中提取出某个矩形大小的图像

 

图片等比缩小

 

# -*- coding: cp936 -*-

import Image  

import glob, os  

  

#图片批处理  

def timage():  

for files in glob.glob(‘D:\\1\\*.JPG‘):  

filepath,filename = os.path.split(files)  

filterame,exts = os.path.splitext(filename)  

#输出路径  

opfile = r‘D:\\22\\‘  

#判断opfile是否存在,不存在则创建  

if (os.path.isdir(opfile)==False):  

os.mkdir(opfile)  

im = Image.open(files)  

w,h = im.size  

#im_ss = im.resize((400,400))  

#im_ss = im.convert(‘P‘)  

im_ss = im.resize((int(w*0.12), int(h*0.12)))  

im_ss.save(opfile+filterame+‘.jpg‘)  

  

if __name__==‘__main__‘:  

timage()

 

取系统返回值赋给序列

 

cmd = os.popen("df -Ph|awk ‘NR!=1{print $5}‘").readlines();

cmd = os.popen(‘df -h‘).read().split(‘\n‘)

cmd = os.popen(‘lo 2>&1‘).read()

 

#取磁盘使用空间

import commands

df = commands.getoutput("df -hP")

[ x.split()[4] for x in df.split("\n") ] 

[ (x.split()[0],x.split()[4]) for x in df.split("\n") if x.split()[4].endswith("%") ] 

 

打印表格

 

map = [["a","b","c"],

   ["d","e","f"],

   ["g","h","i"]]

def print_board():

for i in range(0,3):

for j in range(0,3):

print "|",map[i][j],

#if j != 2:

print ‘|‘

 

生成html文件表格

 

log_file = file(‘check.html‘, ‘w‘)

log_file.write("""

<!DOCTYPE HTML>

<html lang="utr-8">

<head>

<meta charset="UTF-8">

<title></title>

</head>

<body>

<table align=‘center‘ border=‘0‘ cellPadding=‘0‘  style=‘font-size:24px;‘><tr ><td>状态统计</td></tr></table>

<style>.font{font-size:13px}</style>

<table  align=‘center‘ border=‘1‘ borderColor=gray cellPadding=3 width=1350  class=‘font‘>

<tr style=‘

  <th width=65>IP</th>

  <th width=65>状态</th>

</tr>

""")

for i in list:

log_file.write(‘<tr><td>%s</td><td>%s</td></tr>\n‘ %(i.split()[0],i.split()[1]) )

log_file.write("""

</table>

</body>

</html>

""")

log_file.flush()

log_file.close()

 

井字游戏

 

#!/usr/bin/python

# http://www.admin10000.com/document/2506.html

def print_board():

for i in range(0,3):

for j in range(0,3):

print map[2-i][j],

if j != 2:

print "|",

print ""

 

def check_done():

for i in range(0,3):

if map[i][0] == map[i][1] == map[i][2] != " " \

or map[0][i] == map[1][i] == map[2][i] != " ":

print turn, "won!!!"

return True

 

if map[0][0] == map[1][1] == map[2][2] != " " \

or map[0][2] == map[1][1] == map[2][0] != " ":

print turn, "won!!!"

return True

 

if " " not in map[0] and " " not in map[1] and " " not in map[2]:

print "Draw"

return True

 

return False

 

turn = "X"

map = [[" "," "," "],

   [" "," "," "],

   [" "," "," "]]

done = False

 

while done != True:

print_board()

 

print turn, "‘s turn"

print

 

moved = False

while moved != True:

print "Please select position by typing in a number between 1 and 9, see below for which number that is which position..."

print "7|8|9"

print "4|5|6"

print "1|2|3"

print

 

try:

pos = input("Select: ")

if pos <=9 and pos >=1:

Y = pos/3

X = pos%3

if X != 0:

X -=1

else:

 X = 2

 Y -=1

 

if map[Y][X] == " ":

map[Y][X] = turn

moved = True

done = check_done()

 

if done == False:

if turn == "X":

turn = "O"

else:

turn = "X"

 

except:

print "You need to add a numeric value"

 

网段划分

 

题目

192.168.1

192.168.3

192.168.2

172.16.3

192.16.1

192.16.2

192.16.3

10.0.4

 

输出结果:

192.16.1-192.16.3

192.168.1-192.168.3

172.16.3

10.0.4

 

答案

#!/usr/bin/python

 

f = file(‘a.txt‘)

c = f.readlines()

dic={}

 

for i in c:

a=i.strip().split(‘.‘)

if a[0]+‘.‘+a[1] in dic.keys():

key=dic["%s.%s" %(a[0],a[1])]

else:

key=[]

key.append(a[2])

dic[a[0]+‘.‘+a[1]]=sorted(key)

 

for x,y in dic.items():

if y[0] == y[-1]:

print ‘%s.%s‘ %(x,y[0])

else:

print ‘%s.%s-%s.%s‘ %(x,y[0],x,y[-1])

 

统计日志IP

打印出独立IP,并统计独立IP

219.140.190.130 - - [23/May/2006:08:57:59 +0800] "GET /fg172.exe HTTP/1.1" 200 2350253

221.228.143.52 - - [23/May/2006:08:58:08 +0800] "GET /fg172.exe HTTP/1.1" 206 719996

221.228.143.52 - - [23/May/2006:08:58:08 +0800] "GET /fg172.exe HTTP/1.1" 206 713242

 

#!/usr/bin/python

dic={}

a=open("a").readlines()

for i in a:

ip=i.strip().split()[0]

if ip in dic.keys():

dic[ip] = dic[ip] + 1

else:

dic[ip] = 1

for x,y in dic.items():

print x," ",y

 

 

 

不定期更新,更新下载地址:

http://hi.baidu.com/quanzhou722/item/cf4471f8e23d3149932af2a7

 

请勿删除信息,植入广告,抵制不道德行为。

 

 

python实例手册

标签:

原文地址:http://www.cnblogs.com/mhxy13867806343/p/4058488.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!