一起學Python吧~MySQL篇

#!/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()

#
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章