python输入abcd输出对应的1234_python语法部分
https://pypi.python.org/pypi ?#模塊網站
#!/usr/bin/env python ? #在環境變量env中找Python
#coding: utf8
1.自動補全
配置環境: 創建以下文件
vim /usr/local/bin/tab.py
輸入:
import readline
import rlcompleter
readline.parse_and_bind('tab:complete')
存儲后設置 SPYTHONSTARTUP
vim ~/.bash_profile ? 增加以下內容
再最后的export PATH前加
PYTHONSTARTUP=/usr/local/bin/tab.py
export PATH PYTHONSTARTUP
保存后修改可執行權限
chmod +x /usr/local/bin/tab.py
source ~/.bash_profile(馬上生效)
驗證
echo SPYTHONSTARTUP(有值即可)
補全
#source /python_note/tab.sh 即可
關鍵字查詢: improt keyword
keyword.kwlist
循環獲取 ? I %s ?%(ine for line in data)
思路: 根據功能分函數,函數先寫框架
cmp 比較大小
list('abcd') ? >>>['a','b','c','d']
int 可轉進制 ?int('10',base=2) base指定進制數
abs 返回絕對值
divmod(10,3) ?>>>(3,1) 可得商和余
pow ?指數運算,即幾次方
round 四舍五入 round(5.0/3,2)
hex 16進制數
oct 8進制
bin 2進制
ord ?ACCII碼
chr 轉為ACCII編碼
range(5) ?生成0~5的列表
from random improt randint
randint(1,100) 隨機生成一個(1,100)內的數
enumerate 返回元組(下標,元素) 用list(enumerate(1,2))
reversed (反轉序列) 也可 [::-1]
sorted 排序
string.letters (字母大小寫列表)
string.digits (數字列表)
%15s%5s%('name','ager') 格式對齊
%-15s%-5s%('name','ager')左對齊
%s%s%(-10,'name',-5,'ager') *占位 -10和-5
string.centen(48) ?居中字符串
string.capitalize() ?首字母大寫
string.ljust(40,#) 左對齊
string.rjust(40,#)右對齊
string.count('l') ?統計l出現次數
string.endswith('o') 是否以O結尾
string.startswith('e') 是否e開頭
string.islower 是否小寫,有任一大寫則返回flase
string.isupper 是否大寫,有任一小寫則返回flase
string.isdigit 是否數字
string.isacpha 是否字母
string.isalnum 是否數字和字母
string.strip ?去除字符串兩端的空白,可加參數去除指定 string.strip('!') ?去除兩端!字符串,不去除中間
string.lstrip() ?去除左端空白 string.rstrip() ?去除右端空白,
** string.rstrip('\r\n') ?去除右端\r,\n,\r\n
string.vpper ?小寫轉大寫
string.sqlit('.') 以.切割字符串,返回列表
string.replace('o','a') 把o替換為a
improt subprocess ?執行系統命令模塊
subprocess.call('ls -l /home',shell=True)
string.Template() 字符串模塊
data=f.read().decode('gb1803')
f.write(date.encode('utf8'))
列表切片增加:
alist=[10,11,12,13,'zh','li',30]
alist[5:5]=['ww','zl'] (列表中間插入)
alist=[10,11,12,13,'zh','ww','zl','li',30]
列表刪除
del alist[-1] 刪除最后一項
alist.pop() 刪除最后一項并返回刪除項
alist.pop(3) 刪除下標3的項
alist.remove(12) 根據值刪除,相同值時只刪第一個
alist.count(10) 統計10出現次數
alist.extend() 拆分元素增加
alist.index('new') 返回元素的下標,多個時只返回第一個,無則報錯
alist.insert(0,200) 向下標0插入200
alist.reverse() 反轉列表
alist.sort() 排序,默認升序排列
random.shuffle(alist) 打亂排序
alist.sort(reversed=True) 排序時反轉
alist.len() 獲取長度
alist.max() 獲取最大值
alist.min() 最小值
字符串拼接
str_list=['h','e','o']
'.'.join(str_list) ?#以.號連接
輸出'h.e.o'
多用列表,效率高
字典
adict['name'] 字典訪問
for key in adict:
print "%s:%s" %(key,adict[key]) ? 字典循環
"(name)s:%(age)s"% adict 獲取值
adict.pop(key) 彈出健
adict.popitem() 隨機彈
adict.setdefault('mail','bobcatudo') 有則不變更
adict.keys() 返回健
adict.values() 返回值
adict.items() 返回健和值
adict.update(bdict) 字典相加
多if 判斷多個條件時某些值時用字典
cmds = {'0':push_it,'1':pop_it,'2':view_it}
choice=raw_input(prompt).strip()[0] #去掉輸入的空格并獲取第一個值
cmds[choice]() ?#用字典匹配獲取對應的值得調用函數
元組
tuple()
創建單元組時要在后面加,
a=('10',)
元組不可變,但元組中的列表可以變
atuple=(1,[],2)
atuple[1].append(10)
atuple[1].append(20)
結果是 atuple=(1,[10,20],2)
max() 返回最大
mint() 返回最小
alist=['hello','word']
enumerate(alist) ?返回函數對象
list(enumerate(alist))
集合: ? 集合可以去重 ?set(['1','2'])
判斷: big=x if x>y else y
生成器表達式:不真正創建列,返回一個生成器,使用時才生成
(expr for iter_var in iterable if (ond_expr))
print "\r" ? # \r不換行,后面加,連接。
%c 數字轉化為ACCII
%s 先轉化為字符串后
%d 整數類型,只留整數
% d 前面留空格兼容負數
%05d 前面空格補0
%+5d 正數前面顯示+號
%f 浮點數
%5.3f ?寬度為5,小數為3位
%i int
%e 科學計數法
%o ?8進制數
%#o 顯示前綴
花括號格式化
" {} is {} yesas old".format('bob','23')
推薦用花括號格式化
" {0[0]} is {0[1]} yesas old".format(alist)
第一列左對齊寬度為8,第二列為寬度5左對齊,有對齊
" {0:8s} is {1:<5d} yesas old".format('bob','23')
字符串模版
ori_txt='HI ${name},I WILL SEE YOU ${day}'
t=string.Template(ori_txt)
t.substitute(name='bob',day='tomorrow')
調用系統命令建議使用 subprocess
subprocess.call('ls /home', shell=True)
字典:{} 花括號,無序。
dict工廠函數dict((['name','bob'],['age','23'],['email','bob@qq.com']))
{}.fromkeys(('tom','bob','alice'),7) #值固定為7時可以批量創建
輸出:{'bob':7,'alice':7,'tom':7}
adict['key'] 訪問字典
adict.pop['key'] 刪除字典
del adict['key'] 刪除字典
adict.popitem() 隨機刪除值并返回刪除的值
adict.clear 清除字典
adict ={'age':7,'name':'bob'}
'%(name)s:%(age)s' % adict
a=adict.copy() 深復制,值互不影響
clist=alist[:] ?列表復制,值互不影響
adict.get('key') 取出值,不存在返回none
adict.get('key',23) 取出值,不存在返回23
adict.get('key','nout found') 取出值,不存在返回not found
adict.setdefault('age',20) 設置值,存在則不改變.
adict.keys() ?獲取key的列表
adict.items() 獲取值和key的列表
adict.values()獲取值的列表
bdict={'age':23,'name':'bob','emil':'qq@ww.com'}
{value:key for key,value in bdict.items()} #key和value對換,注意value有相同值時會丟項目
adict.update(bdict) 更新字典,可以把bdict合并到adict里
隱藏密碼輸入
import getpass
getpass.getpass("password")
集合
aset= set ('abc')
bset= set ('cde')
aset & base ?等于 set([c]) 交集
aset | base ?等于 set([a b c d e]) 交集
aset - bset 等于 set ([a b]) 差補,即a里有,b里沒有,可以做2個文件的比較差異。
set.add() 添加成員
set.remove() 移除成員
set.update() 批量添加成員
批量執行命令,判斷每一個語句結果
commands = [
'mkdir /tmp/adb',
'echo hello > /tmp/abc/myfile.txt',
'cat /tmp/abc/myfile.txt'
]
def fun0():
def fun1():
def fun2():
func_dict = {0:func0,1:func1,2:func2}
for i in range(len(commands)):
ret_val=subprocess.call(commands[i],shell=True)
if ret_val !=0:
fun_dict[i]()
break
迭代器
myiter= iter('abc')
myiter.next()
到最后會報錯
for 循環可以便利所有類型。
生成器表達式,使用時才生成,節省內存
('172.168.1.%s' %s i for i in range(1,255))
文件處理
.readline() #以/n 結束為一行
flush() 立即同步到文件
\r ?#回車不換行,即在同一行中
os
os.sep # /
os.curdir ?#.
os.pardir ?#..
os.linesep ?#\n
os.mknod('test.txt') ?#創建空文件
os.symlink('/etc/host','zhuji') #快捷方式
os.chmod('test.txt',0644) #0代表8進制,需寫。
cPickle(c語言寫的,數度快),Pickle模塊 存儲對象類型,方便取出。
adict={'name':'bob'}
f=open('/tmp.tx','w')
cPickle.dump(adict,f) #保存字典到文本
cPickle.load(f) ?#讀取文件中的數據
錯誤:
keyboardinterrupt ?:用戶中斷執行
EOFError :沒有內健輸入,到達EOF標記 ,
IOError ?:輸入輸出操作失敗
分析可能產生異常的位置再加try
一個try 可以有多個
except 如:
except (keyboardinterrupt,eoferror) #多個錯誤類型用()包含
except(valueError)
except valueerror ,e : ?# e保存錯誤信息
BaseException ?所有異常
keyboardinterrupt #用戶中斷 即ctrl+c 取消
eoferror 沒有內健輸入 即ctrl+d
IOError ?輸入/輸出操作失敗 ,打開不存在的文件
try:
except:
else: ?#沒報錯才執行
finally: #都執行
with 可以簡化代碼
如:
with open('/etc/fstab') as fs:
print fs.readline()
不必用fs.clock 關閉郵件
定義異常
if not 0
raise ValueError , "age out of rang" #必須為已知異常
斷言異常
assert 0
fun()
b=fun #等于b引用fun的空間
def fun (age,name='bob') ?#默認參數=需放后面
print '%s:%s' (name,age)
函數參數組
def get_args(*arge)
print args
get_args(10,20,30)
def get_kwargs(**kwargs): ?#字典接受數據
print jiejiw
get_kwargs(name='jj',age=23)
info=['bob',23]
get_info(*info) ?#代表傳入列表的2個參數
info_dict={'name':'bob','aee':34}
get_info(**info_dict) #拆開字典,傳入值
choice('+-') 隨機選擇一項
匿名函數
a= lambda x,y:x+y #定義匿名函數
a(20,30)
字典使用匿名函數
mcds={'+': lambda x,y:x+y,'-':lambda x,y:x-y}
num_list=[randint(1,100) for i in range(10)]
filter(函數,序列) ,函數或許序列的作為參數,函數結果為真保留,為假過濾
print filter(lambda x:x%2,num_list)
map(lambda x:x*2,num_list) ?#獲取序列的值
reduce(lambda x,y:x+y,num_list) #統計序列中的和,將第一個序列和第二個相加,結果在和第三個相加
vim 自動縮進
set ai
時間
data=time.strftime("%Y-%m-%d")
檢查文件
md5sum
global #定義全局變量
偏函數
def add(x,y):
return x+y
import functools
add10=functools.partial(add,10) #可以固定X值的模式,第一個參數時函數,第二個參數沒指定y=10時,按順序賦值
add10(3) #等于13
遞歸
例子:排序 ,彈出列表最后一個值和列表每項比較,小的放小列表,大的放大列表,最后放回 小+彈出的值+大,如果列表為空或1時,返回列表
def sou(alist):
if len(alist) == 0 or len(alist) == 1:
return alist
num = alist.pop()
l = []
m = []for?i?in?alist:????if?i?
if name == 'main':
alist = [random.randint(1, 100) for i in range(10)]
print alist
print sou(alist)
閉包
若內部變量想在內部的內部可以使用,則需為可變對象
def count(start=0):
count=[start]
def incr():
counter[0]+=1
return counter[0]
return incr ?#閉包返回的是函數
if name=='main':
a=count()
b=count(10)
print a()
print a()
print b()
裝飾器
mport time
def deco(fun):
def timeit():
start=time.time()
ret_val=fun()
end=time.time()
return ret_val,end-start
return timeit ?#放回函數
@deco ? #裝飾器,將loop當deco的參數運行
def loop():
result=[]
for i in range(1,11):
result.append(i)
time.sleep(0.3)
return result
if name == 'main':
print loop()
hashlib 模塊,作文件校驗。
m=hashlib.md5('hello world!')
m.hexdigest()
tarfile 直接訪問tar文件
tar=tarfile.open('2.tar.gz','w:gz') #創建tar文件
tar.add('day01') #壓縮文件
tar.close()
tar=tarfile.open('day01.tar.gz','r:') #自動識別壓縮方式
tar.extractall('/tmp/') #指定解壓位置
os.walk ?獲取文件夾下文件列表
for path,foler,files in os.walk('/etc/')
for each_file in files:
os.path.join(path,each_file)
testcase/增量備份.py
class ClassName(object): ? #object 是基類或父類
count=0
ClassName.count ?#引用類
mc=ClassName()
mc.count
mc.name='tom'
mc.dist
name:tom ?只顯示實例的屬性
構造器函數
init 調用類時,先執行
class MyClass(object):
def init(self,name): ?#綁定方法,需先實例化才能調用,self是變量名,可自己設,如下a=..
self.name=name ?#實例的屬性,外部需調用此屬性時,要綁定此屬性
def display_name(self):
print name ?#顯示bob
if name=='main':
a=MyClass('bob') ? #實例對象化對象時,會把實例對象傳給self, 即a給self,因此只傳一個參數即可
print a.name ?# 顯示bob
a.display_name()
b=MyClass('alice')
b.display_name()
綁定方法
class Hotel(object):
def init(self,room,cf=1.0,bf=15):
self.room=room
self.cf=cf
self.bf=bf
def calc_all(self,days=1):
return (self.roomself.cf+self.bf) days
if name == 'main':
stroom=Hotel(200)
print stroom.calc_all()
print stroom.calc_all(2)bigroom=Hotel(300)print?stroom.calc_all()print?stroom.calc_all(2)#非綁定方法print?Hotel.calc_all(stroom)
繼承類:
addbook.py
class AddrBook(object):
def init(self,name,phone):
self.name=name
self.phone=phone
def get_phone(self):
return self.phonedef?updata_phone(self,newphone):????self.phone=newphone????print?'%s??updata?phone?%s'?%(self.name,self.phone)
if name == 'main':
bob=AddrBook('bob','1333333')
alis=AddrBook('alis','144444')
print bob.get_phone()
bob.updata_phone('155555')
print bob.get_phone()
email.py
import addbook
class EmplAddrBook(addbook.AddrBook): ? #繼承上一個類
def init(self,name,phone,email):
addbook.AddrBook.init(self,name,phone)super(EmplAddrBook,self).__init__(name,phone)??#super?方法繼承????self.email=emaildef?get_email(self):????return?self.email
dict((['name','bob'],['age','23'],['email','bob@qq.com']))br/>tom=EmplAddrBook('tom','13666','tom@de.cn')
print tom.get_phone()
print tom.get_email()
父類和子類有同名方法時,會調用子類
tom=EmplAddrBook('tom','13666','tom@de.cn')if name == 'main':bob=AddrBook('bob','1231332','bob@tt')
多重繼承
class A(object):
def get_name(self):
print 'in a'
def start(self):
print '' 20
class B(object):
def display_name(self):
print 'in b'
def start(self):
print '#' * 20
class C(A,B):
pass
if name == 'main':
c=C()
c.display_name() ?#繼承所有父類的方法
c.get_name()
c.start() ? #先在A中查找,有就打印了
issubclass(B,A) ?#判斷B是否A的子類
isinstance(b,B) ?#判斷b是否B的實例
hasattr() ?#判斷一個對象是否另一個特定的屬性
getattr() ? #獲得一個對象的屬性
setattr() ? #設置一個對象的屬性
delattr() ? #刪除一個對象的屬性
私有化
class A(object):
def init(self):
self.name='bob' ? #開頭的是私有化
def get_name(self):
return self.__name
a =A()
a.get_name()
class Books(object):
def init(self,title,author):
self.title=title
self.author=author
def str(self): ? ? ? #字符串初始化,比下面更易讀
return self.title
def repr(self):
return self.title ? ?#字符串初始化,
def call(self): ? ? ?#方法調用
print '%s is jiw %s'%(self.title,self.author)
if name == 'main':
py_book=Books('sss','wew')
print py_book
py_book()
正則:
. 匹配任意字符
[..x-y..] 匹配字符組里的任意字符
[^..x-y..] 匹配不再字符組里的任意字符
\d 匹配任意數字【0-9】
\D 非數字字符
\w 匹配任意數字字母下劃線 【0-9a-zA-Z】
\W 非數字字母下劃線
\s 匹配空白字符【\r\v\f\t\n】
\S 非空白字符
literal 匹配字符串的值
re1|rel2 ?匹配re1或re2匹配前面出現的零次或多次
匹配前面出現的一次或多次
? ?匹配前面出現的零次或一次
{M,N} 匹配前面出現至少M次,最多N次
^ 匹配字符串的開始
$ 匹配字符串的結尾
\b 匹配字符串的邊界 ?#egrep '\btom\b' ,只匹配 tom
() ?對正則表達式分組
\nn ?匹配已保存的子組
import re
a=re.match('查找內容','查找目標') #正則查找,但只匹配開始,隱含有^
re.search('查找內容','查找目標') #正則查找,僅匹配一個
a.group() #獲取查找內容
c=re.findall('the','apple the,teh the 22') #查找所有,結果放入列表,可以直接輸出
print c
c=re.finditer('the','apple the ,teh the 22') #返回一個迭代器對象
for i in c:
print i.group() ? #打印迭代器內容
IP地址正則表達式
([0-9]{1,3}.){3}[0-9]{1,3}
MAC地址匹配加符號
%/(..)(..)(..)(..)$/\1:\2:\:3\/g
complie 大量匹配時用,可以提高效率
patt=re.compile('foo')
m=patt.match('food')
print m.group()
split 分隔符切割
mylist=re.split('.|-','hello-world.data')
print mylist
import re
z='firefox'
dica={}
data=open('access_log')
for i in data:
m=re.search(z,i)
if m:
ip=m.group()
dica[ip]=dica.get(ip,0)+1
print dica
sub
re.sub() ?#替換某一個字符
re.sub('X','MR','Hi X ,nice to meet you')
data='my phone number is :1588888696'
m= re.search('.+(\d+)',data)
print m.groups() ? #獲取了()里的值
貪婪匹配 ,即最長匹配,即可能多的匹配
m=re.search('.+?(\d+)',data) #?阻止貪婪匹配
m.groups()
('1588888696')
socket函數與方法:
創建TCP服務器
創建TCP服務器的主要步奏:
1.創建服務器套接字:s=socket.socket()
2.綁定地址到套接字:s.bind()
3.啟動監聽:s.listen()
4.接受客戶連接:s.accept()
5.與客戶端通信:recv()/send()
6.關閉套接字:s.close()
import socket
host='' #空串表示所有地址
port=1234
addr=(host,port)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #網絡的tcp的套接字
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #套接字選項,允許程序退出后立即可以執行,1是允許
s.bind(addr)
s.listen(1) #為一個程序提供服務
while True: #持續鏈接
cli_sock,cli_addr = s.accept() #返回一個套接字元組和地址,yum -y install telnet
print "Client connected from:",cli_addr ?#telnet 127.0.0.1 1234
while True:
cli_sock.send(" i c u \r \n")
data= cli_sock.recv(1024) ?#每次接受1024字節數據
if data.strip() == '' :
break
print datacli_sock.close()
s.close()
==================================
爬取圖片
bob=AddrBook('bob','1231332','bob@tt')
import urllib2
html=urllib2.urlopen('http://www.baidu.com/a.jpg')
data=html.read()
html.close
with open('a.jpg','w') as fobj:
fobj.write(data)
分析apache訪問日志
編寫一個apche日志分析腳本
1.統計每個客戶端的訪問apache服務器的次數
2.將統計信息通過字典的方式顯示出來
3.分別統計客戶端時firefox和msie的訪問次數
4.分別使用函數式編程和面向對象編程的方式實現
import re
def count_patt(fname,patt):
result={}
cpatt=re.compile(patt)with?open(fname)?as?fobf:????for?line?in?fobf:????????m=cpatt.search(line)????#全句查找????????if?m:????????????key=m.group()????????????result[key]=result.get(key,0)+1??#獲取字典的值,沒有則用0return?result
def quick_sort(str_list):
if len(str_list)==0 or len(str_list) ==1:
return str_list
middle=str_list.pop()
smaller=[]
large=[]
for item in str_list:
if item[-1] < middle[-1]:
smaller.append(item)
else:
large.append(item)
return quick_sort(large) +[middle]+quick_sort(smaller)
if name == 'main':
log_file='access_log-2016077'
ip='^(\d+.){3}\d+'
br='Firefox|MSIE'
print count_patt(log_file,ip)
print count_patt(log_file,br)a=count_patt(log_file,ip)print?aprint?quick_sort(a.items())
多線程:
import threading
import subprocess,threading
def myiping(ip):
a=subprocess.call('ping -c2 -i0.1 %s &>/dev/null' % ip,shell=True)
if a:
print '%s is down'%ip
else:
print '%s is up'%ip
net=['172.40.55.%s' %i for i in range(1,255)]
for i in net:
t=threading.Thread(target=myiping,args=[i]) #target是函數名,args是參數
t.start()
利用多線程實現ssh并發訪問
import paramiko
host = '192.168.4.100'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username='root', password='123456')
ssh.exec_command('touch /hh22.txt')
stdin,stdout,stderr=ssh.exec_command('ls /') ?#將結果賦值給3個變量
print stdout.read() ?#獲取輸出結果
4 案例4:利用多線程實現ssh并發訪問
4.1 問題
編寫ssh客戶端腳本,主要要求如下:在文件中取出所有遠程主機IP地址在shell命令行中接受遠程服務器IP地址文件、遠程服務器密碼以及在遠程主機上執行的命令通過多線程實現在所有的遠程服務器上并發執行命令方案
python的paramiko模塊可以實現ssh客戶端的功能,使用起來也比較簡單。但是當服務器非常多的時候,每臺服務器上執行完全相同的簡單操作,也會花費大量的時間。
通過ssh加上多線程,可以實現并發訪問。為了將程序寫的靈活性更強,把要執行的命令以位置參數的方式來提供。
4.2 步驟
實現此案例需要按照如下步驟進行。
步驟一:編寫腳本[root@py01?bin]#?vim?remote_comm.py#!/usr/bin/env?pythonimport?paramikoimport?osimport?sysimport?threadingdef?remote_comm(host,?password,?comm):????ssh?=?paramiko.SSHClient()????ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())????ssh.connect(host,?username='root',?password=password)????stdin,?stdout,?stderr?=?ssh.exec_command(comm)????out?=?stdout.read()????err?=?stderr.read()????if?out:????????print?"[%s:out]:?%s"?%?(host,?out),????if?err:????????print?"%s:Error:?%s",?(host,?err),????ssh.close()if?__name__?==?'__main__':????if?len(sys.argv)?!=?4:????????print?"Usage:?%s?ipfile?password?'comm'"?%?sys.argv[0]????????sys.exit(1)????ipfile?=?sys.argv[1]????if?not?os.path.isfile(ipfile):????????print?"No?such?file:?%s"?%?ipfile????????sys.exit(2)????password?=?sys.argv[2]????comm?=?sys.argv[3]????with?open(ipfile)?as?fobj:????????for?line?in?fobj:????????????ip?=?line.strip()????????????t?=?threading.Thread(target=remote_comm,?args=(ip,?password,?comm))????????????t.start()
xinetd:
yum -y install xinetd
vim /etc/xinetd.d/pyserver
service pyserver
{
flags = NAMEINARGS
type = UNLISTED
socket_type = stream
port = 21345
protocol = tcp
wait = no
user = root
server = /root/lgh/ex1.py
server_args = /root/lgh/ex1.py
}
vim /root/lgh/ex1.py
#!/usr/bin/env python
import sys
sys.stdout.write('sdfe')
sys.stdout.flush() ?#刷新緩存
父進程
os.fork()
celery 框架
import os
import time
pid=os.fork()
print pid
if pid:
print "in par"
time.sleep(15)
print "par ext"
else:
print "in chi"
for i in range(5):
print time.ctime()
time.sleep(1)
print "ch exit"
父進通過os.wait()來得到子進程是否終止信息
python3.0
依賴
yum -y install gcc gcc-c++ opensll-devel libffi-devel readline-devel
https://www.python.org/ftp/python/3.6.1/
字符串直接是UNICOOK
去除回車
print(line,end='')
輸入:
input
5/3 直接返回浮點
5//3 返回整數
異常
except IndexError as e ?#2用逗號,3用as
raise valueerror,'valll.' #2用逗號
raise valueerror('xxxxx') ?#3用括號
range() 和2版本的xrange()一樣。
adict.keys 返回對象,不是列表。
整數統一了,沒長整數
8進制數改成0o11
3也有可變集和和不可變集和
{} 是可變集和
frozenset([])是不可變集和。
數據庫
模塊 MySQL-python 1.2.5 py2.7
mysqlpy 2.1.7 ? ?py3.0
pip3 install PyMySQL 安裝組建
插入數據
import pymysql
conn=pymysql.connect(
host='127.0.0.1',
user='root',
port=3306,
passwd='123456',
db='test'
charset='utf8'
)
cursor=conn.cursor() #游標,獲取SQL結果
sql1="insert into depar(dep_name) values(%s)"
result=cur.execute(sql1,('deve',)) ?#后面是元組,單元組要加逗號
print(result)
conn.commit()
cur.close() ?#關閉游標
conn.close() #關閉數據庫
執行后放回1 是影響1行。
import pymysql
conn=pymysql.connect(
host='127.0.0.1',
user='root',
port=3306,
passwd='123456',
db='test'
charset='utf8'
)
cursor=conn.cursor() #游標,獲取SQL結果
sql1="insert into depar(dep_name) values(%s)"
data=[('hr',),('op',),('財務',)]
result=cur.executemany(sql1,data) ?#多個數據
print(result)
conn.commit()
cur.close() ?#關閉游標
conn.close() #關閉數據庫
import pymysql
conn=pymysql.connect(
host='127.0.0.1',
user='root',
port=3306,
passwd='123456',
db='test'
charset='utf8'
)
cursor=conn.cursor() #游標,獲取SQL結果
sql1="insert into depar(dep_name) values(%s,%s)"
data=[('hr','aa'),('op','bb'),('財務','cc')]
result=cur.executemany(sql1,data) ?#多個數據
print(result)
conn.commit()
cur.close() ?#關閉游標
conn.close() #關閉數據庫
sql1="insert into salary(date,emp_id,basic,extra) values(%s,%s,%s,%s)"
data=(time.strftime('%Y-%m-%d'),1,10000,5000)
result=cur.execute(sql1,data) ?#多個數據
查詢
import pymysql
conn=pymysql.connect(
host='127.0.0.1',
user='root',
port=3306,
passwd='123456',
db='test'
charset='utf8'
)
cursor=conn.cursor() #游標,獲取SQL結果
sql1="select * from departments"
result=cur.fetchone() #獲取一條數據
result2=cur.fetchmany(2) #獲取2條數據
cur.scroll(1,mode="ralative") #相對當前位置移動
result3=cur.fetchmany(2) #獲取2條數據
result3=cur.fetchall() #獲取全部數據
print(result)
conn.commit()
cur.close() ?#關閉游標
conn.close() #關閉數據庫
移動游標獲取數據
cur.scroll(1,mode="ralative") #相對當前位置移動
cur.scroll(2,mode="absolute") #相對查詢結果位置移動
更新
sql1="updata salary set dep=%s where dep=%s"
result=cur.execute(sql1,('oppp','op')) ?#多個數據
刪除
sql1="delete from salary where dep=%s"
result=cur.execute(sql1,('oppp',)) ?#多個數據
SQLalchemy
連接數據庫
安裝
pip3 install SQLalchemy
連接
數據庫類型+驅動://user:password@host/dbname[?key=value...] #[?連接參數]
from sqlalchemy import create_engine
engine=create_engine('mysql+pymysql://root:123456@localhost/dbtest',encoding='utf8',echo=True)
echo=True 表示將日志輸出到終端屏幕,默認為False,調試時用
聲明映射
當使用ORM的時候,配置過程從描述數據庫表開始
通過自定義類映射相應的表
通過聲明系統實現類映射
首先通過聲明系統,定義基類
from sqlalchemy.ext.declarative import declarative_base
Base=declarative_base() ?#聲明基類
創建映射類
一旦創建了基類,就可以創建自定義映射類了
from sqlalchemy import Column,Integer,String
class Departments(Base):
tablename='departments'
dep_id=Column(Integer,primary_key=True)
dep_name=Column(String(20))
def repr(self):
return ""% self.dep_name
#repr是可選項 輸出類的信息,可print(Base)查看
創建架構
類構建完成后,表的信息將被寫入到表的元數據(metadata)
print(Departments.tablename) #查看
創建表
if name == 'main':
Base.metadata.create_all(engine)
創建映射類的實例
創建實例時,并不會真正在表中添加記錄
dep_dev=Departments(dep_name='developments') ?#創建會話后才插入數據
print(dep_dev.dep_name)
print(dep_dev.dep_id)
創建會話類
ORM訪問數據庫的句柄被稱做Session
from sqlalchemy.orm import sessionmaker
Session=sessionmaker(bind=engine)
如果在創建session前還未創建engine,操作如下
Session=sessionmaker()
Session.configure(bind=engine) ?#創建engine后執行
添加新對象
會話類的實例對象用于綁定到數據庫
實例化類的對象,并不打開任何連接
當實例初次使用,它將從Engine維護的連接池中獲得一個連接
當所有的事務均被commit或會話對象被關閉時,連接結束
session=Session()
session.add(dep_dev)
session.commit()
print(str(dep_dev.dep_id))
session.close()
添加新對象
。可以創建多個實例,批量添加記錄
。如果有中文,注意engine的參數
engine=create_engine('mysql+pymysql://root:123456@localhost/dbtest?charset=utf8',encoding='utf8',echo=True)Base.metadata.create_all(engine)dep_hr=Departments(dep_name='hr')dep_op?=?Departments(dep_name='op')dep_finance?=?Departments(dep_name='財務')dep_xz?=?Departments(dep_name='行政')Session=sessionmaker(bind=engine)session=Session()session.add_all([dep_hr,dep_op,dep_xz])??#多行用[]session.commit()session.close()
ORM映射關系也可用于表間創建外鍵約束
from sqlalchemy import Column,Integer,String,ForeignKey
class Employees(Base):
tablename='employees'emp_id=Column(Integer,primary_key=True)name=Column(String(20))genda?=?Column(String(10))phone?=?Column(String(11))dep_id=Column(Integer,ForeignKey('departments.dep_id'))def?__repr__(self):????return?""?%?self.name
日期
from sqlalchemy import Column,Integer,String,ForeignKey,Date
class salary(Base):
tablename='salary'id=Column(Integer,primary_key=True)date=Column(Date)??#日期應用emp_id=Column(Integer,ForeignKey('employees.emp_id'))basic=Column(Integer)extra?=?Column(Integer)
日期插數據
from datetime import date
date1=date(2017,1,1)
bob1=Salary(date=date1,emp_id=4,basic=1000,extra=3000)
基本查詢
通過作用于session的query()函數創建查詢對象
query()函數可以接收多種參數
Session=sessionmaker(bind=engine)
session=Session()
for instance in session.query(Departments).order_by(Departments.dep_id):
print(instance.dep_id,instance.dep_name)
使用ORM描述符進行查詢
返回值是元組
for name,phone in session.query(Employees.name,Employees.phone ): ?#多字段
print(name,phone)
使用命名元組(即為元組下標命名,方便引用)
查詢對象返回的是一個命名元組
名稱是類的名字,或是類中屬性的名字
for row in session.query(Departments,Departments.dep_name)
print(row.Departments,row.dep_name)修改顯示字段名顯示的字段名可以通過label()函數進行修改for?row?in?session.query(Departments.dep_name.label('部門')):????print(row.部門)使用別名可以為經常使用的類定義別名from?sqlalchemy.orm?import?sessionmaker,aliasednew_emp=aliased(Employees)for?row?in?session.query(new_emp,new_emp.name,new_emp.phone).all():????print(row.name,row.phone)排序通過order_by()函數可以實現按指定字段排序?for?instance?in?session.query(Departments).order_by(Departments.dep_id):????print(instance.dep_id,instance.dep_name)提取部分數據通過“切片”的方式,實現部分數據的提取?new_emp=aliased(Employees)?for?row?in?session.query(new_emp,new_emp.name,new_emp.phone).order_by(new_emp.emp_id)[2:4]:????print(row.name,row.phone)結果過濾通過filter()函數實現結果過濾new_emp=aliased(Employees)for?row?in?session.query(new_emp,new_emp.name,new_emp.phone).filter(new_emp.name=='bob'):????print(row.name,row.phone)filter()函數可以疊加使用new_sal=aliased(Salary)for?row?in?session.query(new_sal,new_sal.emp_id,new_sal.basic,new_sal.extra).filter(new_sal.extra?>=2000).filter(new_sal.extra<10000):????print(row.emp_id)????常用過濾操作符????相等??????query.filter(Employees.name=='john')????不相等??????query.filter(Employees.name!='john')????模糊查詢??????query.filter(Employees.name.like('j%'))????in??????query.filter(Employees.name.in_(['j','b']))????not?in??????query.filter(~Employees.name.in_(['j','b']))????字段為空??????query.filter(Employees.name.is_(None))????字段不為空??????query.filter(Employees.name.isnot(None))????多重條件AND?????from?sqlalchemy?import?and_???????query.filter(and_(new_sal.basic>=10000,new_sal.extra>=2000))????多重條件or?????from?sqlalchemy?import?or_???????query.filter(or_(new_sal.basic>=10000,new_sal.extra>=2000))????查詢對象返回值????all()返回列表????first()返回結果中的第一條記錄????one()取出所有記錄,如果不是一條記錄則拋出異常????scalar()調用one(),返回第一列的值?????new_sal=aliased(Salary)?????query=?session.query(new_sal)?????print(query.all())????聚合????通過count()方法,統計行數?????new_sal=aliased(Salary)?????query=?session.query(new_sal).filter(new_sal.extra<10000)?????print(query.count())????多表查詢?????通過join()?方法實現多表查詢????new_emp=aliased(Employees)????new_dep=aliased(Departments)????query=session.query(new_emp.name,new_dep.dep_name).join(new_dep,new_emp.dep_id==new_dep.dep_id)????result=query.all()????print(result)????通過會話的update()方法更新????query=session.query(Departments).filter(Departments.dep_id==8)????query.update({Departments.dep_name:'運營'})????session.commit()????通過會話的字段賦值更新????dep_yy=session.query(Departments).get(8)?#get主鍵????dep_yy.dep_name='運營'????session.commit()????刪除記錄????通過會話的delete()方法進行記錄刪除????dep_yy=session.query(Departments).get(8)?#get主鍵????session.delete(dep_yy)????session.commit()session.close()
總結
以上是生活随笔為你收集整理的python输入abcd输出对应的1234_python语法部分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机二级C语言编程题解读:计算学生成绩
- 下一篇: 用QuartusII 操作操作1位全加法