#!/bin/env python3
#-*- coding:utf8 -*-
#學Python3的第十二天
#crud:增刪改查,create/retrieve/update/delete
# from dbconn import Session, Departments, Employees
#
# #建立數據庫的會連接
# session = Session()
#
# # #創建部門
# # hr = Departments(dep_id=1, dep_name='人事部')
# # ops = Departments(dep_id=2, dep_name='運維部')
# # dev = Departments(dep_id=3, dep_name='開發部')
# # qa = Departments(dep_id=4, dep_name=' 測試部')
# # market = Departments(dep_id=5, dep_name='市場部')
# # sales = Departments(dep_id=6, dep_name='銷售部')
# #通過會話操作數據庫
# #session.add_all([hr,ops,dev,qa,market,sales])
#
# #創建員工
# lb = Employees(
# emp_id=1, emp_name='劉備',
# birth_date='1970-1-10',
# email='[email protected]',
# dep_id=1
# )
# gy = Employees(
# emp_id=2,
# emp_name='關羽',
# birth_date='1971-2-8',
# email='[email protected]',
# dep_id=2
# )
# zf =Employees(
# emp_id=3,
# emp_name='張飛',
# birth_date='1973-4-20',
# email='[email protected]',
# dep_id=2
# )
# zy = Employees(
# emp_id=4,
# emp_name='趙雲',
# birth_date='1980-10-3',
# email='[email protected]',
# dep_id=3
# )
# # session.add_all([lb, gy, zf, zy])
# ##################################
# # #查詢時,直接查詢類 返回的是類的所有實例
# # qset1 = session.query(Departments)
# # print(qset1) #qset1只是查詢語句,取值時,纔會真正連接數據庫
# # #從qset1中取值,方法一,使用all方法返回列表
# # #result1=qset1.all()
# # #print(result1)
# # #從qset1中取值,方法二,直接遍歷
# # for dep in qset1:
# # print(dep.dep_id, dep.dep_name)
#
# # ######################################
# # #查詢時 查詢的是類屬性 返回的是元組
# # qset2 = session.query(Employees.emp_name,Employees.email)
# # for data in qset2:
# # print(data)
# #
# # for name,email in qset2:
# # print(name, email)
# #
# # ######################################
# # #排序(常用)
# # qset3 = session.query(Departments).order_by(
# # Departments.dep_id
# # )
# # for dep in qset3:
# # print(dep.dep_id, dep.dep_name)
# #
# #######################################
# # #切片(不常用)
# # qset4 = session.query(Departments).order_by(
# # Departments.dep_id
# # )[1:3]
# # for dep in qset4:
# # print(dep.dep_id, dep.dep_name)
# #######################################
# # #過濾(常用)
# # qset5 = session.query(Departments).filter(
# # Departments.dep_id < 3
# # )
# # for dep in qset5:
# # print(dep.dep_id, dep.dep_name)
# ########################################
# # #過濾,in / not in操作符
# # qset6 = session.query(Departments).filter(
# # Departments.dep_id.in_([3,5])
# # )
# # for dep in qset6:
# # print(dep.dep_id, dep.dep_name)
# #
# # print('*'*30)
# #
# # qset7 = session.query(Departments).filter(
# # ~Departments.dep_id.in_([3,5])
# # )
# # for dep in qset7:
# # print(dep.dep_id, dep.dep_name)
# #######################################
# # #字段爲空null 、不爲空
# # qset8 = session.query(Departments).first(Departments.dep_name.is_(None))
# # qset9 = session.query(Departments).first(Departments.dep_name.isnot(None))
#
# #####################################
# # #在查詢結果中取值,all返回所有結果的列表
# # qset10 = session.query(Employees.emp_name, Employees.email)
# # print(qset10.all())
# #######################################
# #在查詢結果中取值,first返回第一項的值
# # qset11 = session.query(Employees.emp_name, Employees.email)
# # print(qset11.first())
# #####################################
# # #多表查詢 query中先寫Employees ,join就要填Departments
# # query中先寫join就要填Departments,join就要填Employees
# # qset12 = session.query(Employees.emp_name, Departments.dep_name).join(Departments)
# # qset13 = session.query(Departments.dep_name, Employees.emp_name).join(Employees)
# # print(qset12.all())
# # print(qset13.all())
# ####################################
# # #修改 就是重新賦值
# # qset14 = session.query(Departments).filter(
# # Departments.dep_name == '人事部'
# # )
# # hr = qset14.first()
# # hr.dep_name = '人力資源部'
# ###################################
# # #刪除
# # qset15 = session.query(Departments).filter(
# # Departments.dep_id == 6
# # )
# # sales = qset15.first()
# # session.delete(sales)
#
#
#
# #確認
# session.commit()
#
# #關閉回話
# session.close()
# #ping.py
# import time
# import subprocess
#
# def ping(host):
# result = subprocess.run(
# 'ping -c2 %s &> /dev/null' % host,
# shell=True
# )
# if result.returncode == 0:
# print('%s:up' % host)
# else:
# print('%s down' % host)
#
#
# if __name__ == '__main__':
# ips = ('172.40.84.%s' % i for i in range(1, 255))
# start = time.time()
# for ip in ips:
# ping(ip)
# end = time.time()
# print('耗時: ', start - end, 's')
#*********************多進程
#forking創建子進程
# import os
#
# print('starting...')
# retval = os.fork() #實現forking功能 子進程返回PID0
# if retval: #如果是1就執行
# print('hello from parent') #父進程幹
# else:
# print('hello from child') #子進程
#
# print('hello from both')
#myfork.py
# import os
#
# print('starting...')
# for i in range(3):
# retval = os.fork()
# if not retval: #子進程打印
# print('Hello World')
# exit() #進程遇到exit就徹底結束 否則就會打印7遍(子進程還能產生子進程)
#
# print('Done') #只有父進程能打印
#多進程ping(節省大量時間取消三次握手)
"""
windows 不支持多進程支持多線程
各操作系統均支持多線程
"""
# #ping2.py
# import os
# import time
# import subprocess
#
# def ping(host):
# result = subprocess.run(
# 'ping -c2 %s &> /dev/null' % host,
# shell=True
# )
# if result.returncode == 0:
# print('%s:up' % host)
# else:
# print('%s down' % host)
#
#
# if __name__ == '__main__':
# ips = ('172.40.84.%s' % i for i in range(1, 255))
# start = time.time()
#
# for ip in ips:
# retval = os.fork()
# if not retval:
# ping(ip)
# exit()
# end = time.time()
#
# print('耗時:', start - end, 's')
# #製造殭屍進程
# import os
# import time
#
# retval = os.fork()
# if retval:
# print('parent')
# time.sleep(45)
# print('parent done')
# else:
# print('child')
# time.sleep(15)
# print('child done')
"""
終端輸入watch -n1 ps a實時監測後臺進程 Z+的就是殭屍老弟
kill 和kill -9是都解決不掉的
"""
#****************以下內容解決殭屍進程一般不會用到*******************
#********************畢竟寫服務器的人寥寥無幾**********************
#os.waitpid掛起子進程完美解決Z+殭屍進程
# import os
# import time
#
# retval = os.fork()
# if retval:
# print('parent')
# #掛起父進程 處理完變成殭屍進程的子進程後才繼續
# result = os.waitpid(-1,0)
# print(result) #result是(子進程PID,0)
# time.sleep(10)
# print('parent done')
# else:
# print('child')
# time.sleep(15)
# print('child done')
#
# #os.waitpid也可不掛起 製造殭屍進程Z+
# import os
# import time
#
# retval = os.fork()
# if retval:
# print('parent')
# #掛起父進程 處理完變成殭屍進程的子進程後才繼續
# result = os.waitpid(-1, 1) #不掛起父進程
# time.sleep(10)
# print('parent done')
# else:
# print('child')
# time.sleep(15)
# print('child done')
#多線程
"""
當程序運行時,就會出現進程,可以說,進程就是加載內存中的一系列的指令,
每個進程都擁有自己獨立的運行空間.
進程還可以擁有多個線程.同意進貨高層內的所有線程,共享進程的運行空間.
多線程沒有殭屍進程問題
多線程的編程思路:
主線程(類似)
"""
#mtpin.py
# import subprocess
# import threading
#
# def ping(host):
# result = subprocess.run(
# 'ping -c2 %s &> /dev/null' % host,
# shell=True
# )
# if result.returncode == 0:
# print('%s:up' % host)
# else:
# print('%s down' % host)
#
#
# if __name__ == '__main__':
# ips = ('172.40.84.%s' % i for i in range(1, 255))
# for ip in ips:
# #創建工作線程
# t = threading.Thread(target=ping, args=(ip,))
# #啓動工作線程,就是調用相應的函數,函數結束,工作線程也就結束了
# t.start() #調用target(*args)
# #調用類(用__call__)
# import subprocess
# import threading
#
# class Ping:
# def __call__(self,host):
# result = subprocess.run(
# 'ping -c2 %s &> /dev/null' % host,
# shell=True
# )
# if result.returncode == 0:
# print('%s:up' % host)
# else:
# print('%s down' % host)
#
#
# if __name__ == '__main__':
# ips = ('172.40.84.%s' % i for i in range(1, 255))
# for ip in ips:
# #target是Ping的實例
# t = threading.Thread(target=Ping(), args=(ip,))
# t.start()
#使用__init__
# import subprocess
# import threading
#
# class Ping:
# def __init__(self,host):
# self.host = host
#
# def __call__(self):
# result = subprocess.run(
# 'ping -c2 %s &> /dev/null' % self.host,shell=True
# )
# if result.returncode == 0:
# print('%s:up' % self.host)
# else:
# print('%sdown' % self.host)
#
#
# if __name__ == '__main__':
# ips = ('172.40.84.%s' % i for i in range(1, 255))
# for ip in ips:
# #創建工作線程
# t = threading.Thread(target=Ping(ip))
# t.start()
#*****************urllib模塊
"""
實現http客戶端功能
包括4個子模塊
request:最常用的模塊
error:定義錯誤,實現異常
parse:用來解析和處理URL
robotparse:解析頁面的robots.txt文件
"""
# from urllib import request
#
# url = 'http://www.baidu.com'
# html = request.urlopen(url)
# html.readline()
# html.read(10)
# html.readlines()
# #簡單爬去網頁圖片
# from urllib import request
# import sys
#
# def download(url, fname):
# html = request.urlopen(url)
#
# with open(fname, 'wb') as fobj:
# while 1:
# data = html.read(4096)
# if not data:
# break
# fobj.write(data)
#
# if __name__ == '__main__':
# url = sys.argv[1]
# fname = sys.argv[2]
# download(url, fname)
# #修改請求頭(繞過防禦)
# from urllib import request
#
# url = 'http://www.jianshu.com'
# html = request.urlopen(url) #403:Forbidden
# #簡書他會做基本檢查,發現請求不是正常的人爲行爲,將會拒絕
# #改變頭部信息,騙過簡述服務器,客戶端瀏覽器改爲火狐
# from urllib import request
#
# url = 'http://www.jianshu.com'
# heads = {'User-Agent': 'Mozilla/5.0 (x11; Linux x86_64; rv:52.0)'
# 'Gecko/20100101 Firefox/52.0'}
# r = request.Request(url, headers=heads)
# html = request.urlopen(r)
# print(html.read())
#url編碼
"""
url只允許一部分ascii字符,其他字符需要編碼
"""
# from urllib import request
#
# # url = 'https://www.sogou.com/web?query=元旦'
# # html = request.urlopen(url) #會報錯 因爲只支持一部分ascii字符
#
# url = 'https://www.sogou.com/web?query=' + request.quote('性感荷官在線喫飯')
# print(url)
# #使用wget模塊
# import wget
#
# url = 'https://gss2.bdstatic.com/9fo3dSag_xI4khGkpoWK1HF6hhy/baike/c0%3Dbaike150%2C5%2C5%2C150%2C50/sign=e95e57acd20735fa85fd46ebff3864d6/f703738da9773912f15d70d6fe198618367ae20a.jpg'
# wget.download(url,'/tmp/fbb.jpg')
#下載所有網易圖片
"""
找到所有圖片url
下載圖片
"""
# import wget
# import os
# import re
#
# def get_url(fname,patt,encoding=None):
# result = []
# cpatt = re.compile(patt)
#
# with open(fname,encoding=encoding) as fobj:
# for line in fobj:
# m = cpatt.search(line)
# if m:
# result.append(m.group())
#
# return result
#
#
# if __name__ == '__main__':
# img_dir = '/tmp/163'
# fname163 = '/tmp/163/163.html'
# url163 = 'http://www.163.com'
# #如果不存在保存圖片的目錄,則創建
# if not os.path.exists(img_dir):
# os.mkdir(img_dir)
#
# #如果網易首頁文件不存在, 則下載
# if not os.path.exists(fname163):
# wget.download(url163,fname163)
#
# #取出網易首頁中所有的圖片地址
# img_patt = '(http|https)://[-\w/.]+\.(jpg|png|jpeg|gif)'
# img_list = get_url(fname163,img_patt,'gbk')
# #下載圖片
# for url in img_list:
# wget.download(url,img_dir)
#*************************午間/晚間練習****************************
# class Date:
# def __init__(self,year,month,date):
# self.year = year
# self.month = month
# self.date = date
#
# @classmethod #類方法,不用創建實例即可調用
# def create(cls,dstr):
# y,m,d = map(int,dstr.split('-')) ##map(int,['2000','5','4'])
# dt = cls(y,m,d) #即Date(y,m,d)
# return dt
#
# @staticmethod #靜態方法 寫在類的外面,可以獨立成爲一個函數,'愣'把它放到類中了
# def is_date_valid(dstr):
# y,m,d = map(int,dstr.split('-'))
# return 1 <= d <= 31 and 1 <= m <= 12 and y < 4000
#
# if __name__ == '__main__':
# bith_date = Date(1995,12,3)
# print(Date.is_date_valid('2000-5-4'))
# day = Date.create('2000-5-4')
# print(day)
#OPP練習
# import os
#
# class Convert:
# def __init__(self,fname):
# self.fname = fname
#
# def to_linux(self):
# dst_fname = os.path.splitext(self.fname)[0]+ '.linux'
# with open(self.fname,'r')as src_fobj:
# with open(dst_fname,'w')as dst_fobj:
# for line in src_fobj:
# line = line.rstrip() + '\n'
# dst_fobj.writelines(line)
#
# def to_windows(self):
# dst_fname= os.path.splitext(self.fname)[0]+ ',windows'
# with open(self.fname,'r')as src_fobj:
# with open(dst_fname,'w')as dst_fobj:
# for line in src_fobj:
# line = line.rstrip() + '\r\n'
# dst_fobj.write(line)
#
# if __name__ == '__main__':
# c = Convert('/tmp/passwd') #cp /etc/passwd /tmp
# c.to_linux()
# c.to_windows()
#***************re模塊基礎
# import re
#
# m = re.match('f', 'food') #匹配到返回對象
# print(re.match('f..', 'seafood')) #匹配不到返回None
# m.group() #返回匹配的值
# m = re.search('f..', 'seafood') #全文搜索匹配
# m.group()
# re.findall('f', 'seafood is food') #返回所有匹配項組成的列表
#
# result = re.finditer('f..','seafood is food') #返回匹配對象組成的迭代器
# for m in result: #從迭代器中逐個取出匹配對象
# print(m.group())
#
# re.sub('f..', 'abc', 'fish is food')
# re.split('\.|-',' hello-world.tar.gz') #用.和-做切割符號
#
# patt = re.compile('f..') #先把要匹配的模式編譯,提升效率
# m = patt.search('seafood') #指定在那個字符串中匹配
# m.group()
# #re練習:匹配文件中制定模式
# import re
#
# def count_patt(fname,patt):
# cpatt = re.compile(patt)
# result = {}
#
# with open(fname)as fobj:
# for line in fobj:
# m = cpatt.search(line) #如果匹配不到 返回None
# if m:
# key = m.group()
# result[key] = result.get(key, 0)+1
#
# return result
#
#
# if __name__ == '__main__':
# fname = 'access_log'#apache日誌文件
# ip = '^(\d+\.){3}\d+' #日誌開頭的ip地址
# print(count_patt(fname,ip))
# br = 'Firefox|MSIE|Chrome' #日誌中客戶端瀏覽器
# print(count_patt(fname,br))
#re練習;模式匹配進階寫法
# import re
# from collections import Counter # Counter對象是有序的,字典無序
#
# class CountPatt:
# def __init__(self, fname):
# self.fname = fname
#
# def count_patt(self, patt):
# cpatt = re.compile(patt)
# result = Counter()
#
# with open(self.fname) as fobj:
# for line in fobj:
# m = cpatt.search(line) # 如果匹配不到,返回None
# if m:
# result.update([m.group()])
#
# return result
#
#
# if __name__ == '__main__':
# c = CountPatt('access_log')
# ip = '^(\d+\.){3}\d+'
# br = 'Firefox|MSIE|Chrome'
# a = c.count_patt(ip)
# print(a)
# print(a.most_common(3)) # 訪問量最大的前三名
# print(c.count_patt(br))
#*********socket基礎
# import socket
#
# host = ''#表示本機所有地址0.0.0.0
# port =123456 #應該大於1024
# addr = (host, port)
# s = socket.socket() #默認值就是基於tcp的網絡套接字
# #設置選項,程序結束之後可以立即在運行,否則需要等60秒
# s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# s.bind(addr) #綁定地址到套接字
# s.listen(1) #啓動監聽進程
# cli_sock,cli_addr = s.accept() #等帶客戶端鏈接
# print('Client connect from: ',cli_addr)
# print(cli_sock.recv(1024)) #一次最多讀1024字節數據
# cli_sock.send(b'I4CPU\r\n') #發送的數據要求是bytes類型
# cli_sock.close()
# s.close()
#可重用的TCP服務器
# import socket
#
# host = ''
# port = 12345
# addr = (host, port)
# s = socket.socket()
# s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# s.bind(addr)
# s.listen(1)
# while True:
# cli_sock, cli_addr = s.accept()
# print('Client connect from:', cli_addr)
# while True:
# data = cli_sock.recv(1024)
# if data.strip() == b'end':
# break
# print(data.decode('utf8')) # bytes類型轉爲string類型
# data = input('> ') + '\r\n' # 獲得的是string類型
# cli_sock.send(data.encode('utf8')) # 轉成bytes類型發送
# cli_sock.close()
# s.close()
# #簡單完整的TCP服務器
# import socket
# from time import strftime
#
# class TcpTimeServer:
# def __init__(self, host='', port=12345):
# self.addr = (host, port)
# self.serv = socket.socket()
# self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# self.serv.bind(self.addr)
# self.serv.listen(1)
#
# def chat(self, c_sock):
# while True:
# data = c_sock.recv(1024)
# if data.strip() == b'quit':
# break
# data = '[%s] %s' % (strftime('%H:%M:%S'), data.decode('utf8'))
# c_sock.send(data.encode('utf8'))
# c_sock.close()
#
# def mainloop(self):
# while True:
# cli_sock, cli_addr = self.serv.accept()
# self.chat(cli_sock)
#
# self.serv.close()
#
# if __name__ == '__main__':
# s = TcpTimeServer()
# s.mainloop()
#簡單的TCP客戶端
# import socket
#
# host = '192.168.4.254' #服務器IP地址
# port = 123456 #服務器端口
# addr = (host,port)
#
# c = socket.socket()
# c.connetc(addr)
# while True:
# data = input('>')+ '\r\n'
# c.send(data.encode('utf8')) #服務器收到end結束,所以要先發送在判斷
# if data.strip() == 'end':
# break
# data = c.recv(1024)
# print(data.decode('utf8'))
#
# c.close()
# #簡單的udp服務器流程
# import socket
# from time import strftime
#
# host = ''
# port = 12345
# addr =(host,port)
# s = socket.socket(type=socket.SOCK_DGRAM)
# s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
# s.bind(addr)
#
# while True:
# data.cli_addr = s.recvfrom(1024)
# clock = strftime('%H:%M:%S')
# data = data.decode('utf8')
# data = '[%s]%s' %(clock,data)
# s.sendto(data.encode('utf8'),cli_addr)
#
# s.close()
#簡單的udp客戶端的流程
# import socket
#
# host = '192.168.4.254'
# port = 12345
# addr = (host,port)
#
# c = socket.socket(type=socket.SOCK_DGRAM)
#
# while True:
# data = input('>')
# if data.strip() == 'quit':
# break
# c.sendto(data.encode('utf8'),addr)
# print(c.recvfrom(1024)[0].decode('utf8'))
# #print(c.recvfrom(1024))
#
# c.close()
#
一起學Python吧~MySQL篇
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.