Python之操作Excel、異常處理、網絡編程


知識補充:
1.falsk模塊中一些方法總結
import flask
from flask import request,jsonify
server = flask.Flask(__name__) #把當前文件當作一個服務
 
server.config['JSON_AS_ASCII'] = False #不以ASCII碼傳
 
@server.route('/reg',methods=['post','get']) #接口方法前的修飾
methods有兩個值:post和get
 
jsonify({"msg":"ok"}) #接口返回值時用到,將字典轉化json串,json串為字符串
request模塊獲取普通元素值,json值,cooies值,session,header,文件
req=request.values.get('username') #獲取值
req=request.json #獲取json值
token = request.cookies.get('token') #獲取cookie值
req = request.session.get('session') #獲取session值
req = request.headers.get('header')#獲取header值
f = request.files.get('file_name',None) #獲取file
server.run(debug=True) #運行接口,port默認是5000,也可以自己指定,debug模式修改接口后會自動重啟
server.run(port=8989,host='0.0.0.0')
#host寫成0.0.0.0的話,其他人都可以訪問,代表監聽多塊網卡上面所有的ip
2.加鹽:提高安全性
salt='*hhf*2342234sdfs' 鹽值自己定義,為一個隨機字符串
鹽值+密碼+鹽值 一起加密,會更安全
 
3.深拷貝、淺拷貝:
在python中,對象賦值實際上是對象的引用,當創建一個對象,然后把它賦給另一個變量的時候,python並沒有拷貝這個對象,而只是拷貝了這個對象的引用
舉例說明:
(1)直接賦值, 傳遞對象的引用, 原始對象改變,被賦值的b也會做相同的改變
lis =[2,4,5,["A",1,2]]
b = lis
print(b)
lis.append(6)
print(b)
print(lis)
結果:
[2, 4, 5, ['A', 1, 2]]
[2, 4, 5, ['A', 1, 2], 6]
[2, 4, 5, ['A', 1, 2], 6]
 
(2)copy淺拷貝,沒有拷貝子對象,所以原始對象中元素改變,拷貝后對象中元素不變,原始對象子對象元素改變,拷貝后子對象中元素也跟着改變
import copy
lis =[2,4,5,["A",1,2]]
b = copy.copy(lis)
print("b的初始值",b)
 
lis.append(6)
print("lis添加元素后的值:",lis)
print("lis添加元素后b的值:",b)
 
lis[3].append('sss')
print("lis元素添加子元素后的值:",lis)
print("lis元素添加子元素后b的值:",b)
結果:
b的初始值 [2, 4, 5, ['A', 1, 2]]
lis添加元素后的值: [2, 4, 5, ['A', 1, 2], 6]
lis添加元素后b的值: [2, 4, 5, ['A', 1, 2]] #lis添加元素,b的值未變
lis元素添加子元素后的值: [2, 4, 5, ['A', 1, 2, 'sss'], 6]
lis元素添加子元素后b的值: [2, 4, 5, ['A', 1, 2, 'sss']]#lis中元素添加子元素后,b中的值也變了
3)深拷貝,拷貝對象所有元素,原始對象的改變不會造成深拷貝里任何子元素的改變
import copy
lis =[2,4,5,["A",1,2]]
b = copy.deepcopy(lis)
print("b的初始值",b)
 
lis.append(6)
print("lis添加元素后的值:",lis)
print("lisi添加元素后b的值:",b)
 
lis[3].append('sss')
print("lis元素添加子元素后的值:",lis)
print("lis元素添加子元素后b的值:",b)
結果:
b的初始值 [2, 4, 5, ['A', 1, 2]]
lis添加元素后的值: [2, 4, 5, ['A', 1, 2], 6]
lisi添加元素后b的值: [2, 4, 5, ['A', 1, 2]]
lis元素添加子元素后的值: [2, 4, 5, ['A', 1, 2, 'sss'], 6]
lis元素添加子元素后b的值: [2, 4, 5, ['A', 1, 2]]

 

 
一、Python操作excel
python操作excel,python操作excel使用xlrd、xlwt和xlutils模塊,xlrd模塊是讀取excel的,xlwt模塊是寫excel的,xlutils是用來修改excel的。這幾個模塊使用pip安裝即可
pip install xlrd
pip install xlwt
pip install xlutils
 
1.讀取excel的操作
import xlrd
book = xlrd.open_workbook(r'students.xlsx') #
#也可以寫絕對路徑,讀excel的時候,xls,xlsx都可以
print(book.sheet_names())
#獲取所有sheet頁的名字
 
sheet = book.sheet_by_index(0)
#根據sheet頁的位置去取sheet
sheet2 = book.sheet_by_name('Sheet2')
#根據sheet頁的名字獲取sheet頁
 
print(sheet.nrows)#獲取sheet頁里面的所有行數
print(sheet.ncols)#獲取sheet頁里面的所有列數
print(sheet.row_values(0))#根據行號獲取整行的數據
print(sheet.col_values(0))#根據列獲取整列的數據
 
print(sheet.cell(1,1))#獲取第2行第2列的數
#cell 方法是獲取指定單元格數據,前面是行,后面是列
#結果:text:'小明'
print(sheet.cell(1,1).value)
#結果:小明
練習:讀取表格中內容
格式如下:
[
{
"id":1,
"name":"小明",
"sex":"男"
},
 ]
代碼如下:
import
xlrd book = xlrd.open_workbook(r'students.xlsx') sheet = book.sheet_by_index(0) lis=[] for i in range(1,sheet.nrows): #i代表的是每一行,因為第一行是表頭,所以直接從第二行開始循環 dic ={} id = sheet.cell(i,0).value#行是不固定的,列是固定的 name = sheet.cell(i,1).value sex = sheet.cell(i,2).value dic['id']=id dic['name']=name dic['sex']=sex res.append(dic) print(res)
2.寫excel的操作
import xlwt
book = xlwt.Workbook()#新建一個excel對象
sheet = book.add_sheet('stu')#添加一個sheet頁
sheet.write(0,0,'編號') #將內容寫到excel
book.save('stu.xls')#寫excel的時候,你保存的文件名必須是xls

練習:將lis與title的內容寫到Excel中

import xlwt
lis = [{'id': 1, 'name': '小明', 'sex': ''},
{'id': 2, 'name': '小黑', 'sex': ''},
{'id': 3, 'name': '小怪', 'sex': ''},
{'id': 4, 'name': '小白', 'sex': ''}]
title = ['編號','姓名','性別']
book = xlwt.Workbook()#新建一個excel對象
sheet = book.add_sheet('stu')#添加一個sheet頁
for i in range(len(title)):
#title多長,循環幾次
sheet.write(0,i,title[i])
#i既是lis的下標,也代表每一列#處理表頭
 
for row in range(len(lis)):
id=lis[row]['id']
#因為lis里面存的是一個字典,lis[row]就代表字典里面的每一個元素,然后
#字典取固定的key就可以了
name=lis[row]['name']
sex=lis[row]['sex']
new_row =row+1#因為循環的時候 是從0開始循環的,第0行是表頭,不能寫
#要從第二行開始寫,所以這里行數要加1
sheet.write(new_row,0,id)
sheet.write(new_row,1,name)
sheet.write(new_row,2,sex)
book.save('stu.xls')
3.修改excel內容
from xlutils.copy import copy
import xlrd,xlwt
book = xlrd.open_workbook('new_stu.xls')
#打開原來的excel
new_book = copy(book) #通過xlutils里面copy復制一個excel對旬
#print(dir(new_book)) 查看new_book下的方法
sheet = new_book.get_sheet(0) #獲取sheet頁
sheet.write(0,0,'id')#寫入修改的內容
new_book.save('new_stu_1.xls') #保存excel
二、異常處理
1. 常見的一些異常信息
AttributeError: 試圖訪問一個對象沒有的屬性,比如foo.x,但是foo沒有屬性x
IOError:輸入 / 輸出異常,一般是無法打開文件
ImportError: 無法導入模塊或包,一般是路徑問題或名稱錯誤
IndentationError:代碼沒有正確對齊,屬於語法錯誤
IndexError:下標索引超出序列邊界,比如x只有三個元素,卻試圖訪問x[3]
KeyError:試圖訪問字典里不存在的鍵
KeyboardInterrupt:Ctrl + C被按下
NameError:使用一個還未被賦予對象的變量
SyntaxError: 語法錯誤
TypeError: 傳入對象類型與要求的不符
UnboundLocalError:試圖訪問一個還未被設置的局部變量,一般是由於在代碼塊外部還有另一個同名變量
ValueError: 傳入一個調用者不期望的值,即使值的類型是正確的
2.異常處理實例
(1)try...except..else...finally
info = {
"id":1,
"name":"xiaobai",
"sex":"nan",
}
choice =input('請輸入你要查看的屬性:')
try:
#print(info[choice])
print(info[choice]()) #也會報錯 TypeError
except Exception as e:
#這個exception能捕捉到所有的異常
#Python3
#這個是出了異常的話,怎么處理,e代表異常信息
print("出錯了,錯誤信息是:",e)
else:
#沒有異常的話,走這里
print("沒有出異常的話,走這里")
finally:
#不管有沒有出異常都會走
#什么時候用:關閉文件,關閉數據庫連接
print("這里是finally")
 
2.主動拋出異常
def is_correct_sql(sql):
sql_start =['select','update','insert','delete']
flag = 0
if sql.startswith(sql_start[0]) or sql.startswith(sql_start[1]) or \
sql.startswith(sql_start[2]) or sql.startswith(sql_start[3]):
return True
else:
raise TypeError #主動拋出異常
s = OpertionMysql(sql="xxxxxx")
print(s)
三、網絡編程
1.urllib模塊
requests模塊就是基於urllib模塊開發的,requests模塊比較好用
(1)urlopen(url)發送get請求
from urllib.request import urlopen
import json
url= '//127.0.0.1:8888/json'
data = {'user_id':1}
req = request.urlopen(balance_url + '?' + new_balance_data) # 發送get請求
print(req.read().decode())
# 獲取接口返回的結果,返回的結果是bytes類型的,需要使用decode方法解碼,變成一個字符串
2)urlopen()發送post請求
from urllib.request import urlopen
from urllib.parse import urlencode
import json
url2 = 'http://127.0.0.1:8888/reg'
data = {
"username":"haha",
"password":"123456",
"c_passwd":"123456"
}
print(urlencode(data))#把參數拼接成xxx=xxx&xxx=xxx
#結果:password=123456&username=haha&c_passwd=123456
param = urlencode(data).encode() #轉成二進制
# 發送post請求,傳入參數的話,參數必須是bytes類型,所以需要先encode一下,變成bytes類型
print(urlopen(url2,param).read().decode())
 
#print(urlopen(url2,urlencode(data)).read().decode())
#這種會報錯 TypeError: POST data should be bytes or an iterable of bytes. It cannot be of type str
3)url編碼
from urllib.parse importquote,unquote,quote_plus,unquote_plus
url = 'http://127.0.0.1:5000/reg:.,\\'
url2 = "http%3A//127.0.0.1%3A5000/reg%3A.%2C%5C"
quote把特殊寫字符變成url編碼,quote_plus轉更復雜的字符
unquote就是把url編碼轉成字符串,unquote_plus轉更復雜的url編碼
print(quote(url))
print(unquote(url2))
print(unquote_plus(url2))
 
2.requests模塊
(1)調用get方法
import requests
url = 'http://127.0.0.1:5000/get_sites'
url2 = 'http://127.0.0.1:5000/json'
data = {'user_id': 1}
res = requests.get(url).text
# 發送get請求,並獲取返回結果,text獲取的結果是一個字符串
res = requests.get(url,data).json()
# 發送get請求,並獲取返回結果,json()方法獲取的結果直接是一個字典
print(res)
 
(2)調用post方法
import requests
url_reg = 'http://127.0.0.1:5000/reg?username=hha&password=123456&c_passwd=123456'
#直接傳拼接好的url
res = requests.post(url_reg).json()
print(type(res),res)
 
(3)入參是json串
url_set = 'http://127.0.0.1:5000/set_sites'
d = {
"name":"妞妞雜貨鋪",
"url":"http://www.nnzhp.cn"
}
#通過 json=xx來傳值
res = requests.post(url_set,json=d).json()
print(res)
 
(3)添加cookie
import requests
cookie_url = "http://127.0.0.1:5000/set_cookies"
data = {'userid':1,"money":9999}
cookie = {'token':"token12345"}
res = requests.post(cookie_url,data=data,cookies={"token":"token1111"}).json()#使用cookies參數指定cookie
print(res)
#flask怎么獲取cookie的值 request.cookies.get("cookie")
 
(4)發送文件
import requests
up_url = 'http://127.0.0.1:5000/upload'
file = {'file_name':open('aaa.py')}
res = requests.post(up_url,files=file).text
#指定files參數,傳文件,是一個文件對象
print(res)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM