pythonws
㈠ python怎麼連接websocket
以下有一個例子,是基於python27版本的,先要pip安裝websocket-client。
大概流程如下,具體的傳輸的數據,還是要知道client和server之間的消息通訊規定,改成自己需要的
#-*-encoding:utf-8-*-
importsys
fromsocketimport*
importjson,time,threading
fromwebsocketimportcreate_connection
reload(sys)
sys.setdefaultencoding("utf8")
#config={
#'HOST':'127.0.0.1',
#'PORT':10086
#}
#pipinstallwebsocket-client
classClient():
虧旁運def__init__(self):
#調用create_connection方法,建立一個websocket鏈接
#鏈接地址請修改成你自己需要的
self.ws=create_connection("ws://47.93.91.89:10086/name/hehe")
#建一個線程,監聽伺服器發送給客戶端的數據
self.trecv=threading.Thread(target=self.recv)
self.trecv.start()
#發送方法,聊天輸入語句時調用,此處默認為群聊ALL
defsend(self,content):
#這里定義的消息體要換成你自己的消息體,變成你需要的。
msg={
"type":"POST",
"username":"hehe",
"sendto":"ALL",
"content":content
}
msg=json.mps(msg)
self.ws.send(msg)
#接收服務端發送給客戶的數據,只要ws處於連接狀態,則一直接收數據
def銷梁recv(self):
try:
whileself.ws.connected:
result=self.ws.recv()
print"receivedmsg:"+str(result)
exceptException,e:
pass
#關閉時,發送QUIT方法,退出ws鏈接
defclose(self):
#具體要知道你自己退出鏈接的消息體是什麼,如果沒有,可以不寫這個方法
msg={
"type":"QUIT",
"username":"johanna",
"content":"byebye,everyone"
}
msg=json.mps(msg)
self.ws.send(msg)
if__name__=='__main__':
c=Client()
#當輸入非exit時,啟答則持續ws鏈接狀態,如果exit,則關閉鏈接
whileTrue:
content=raw_input("pleaseinput(inputexittoexit):")
ifcontent=="exit":
c.close()
break
else:
c.send(content)
time.sleep(1)
㈡ python中sals_ws和sals_wb啥意思
sals_ws和sals_wb可能是不同的東西。sals_ws可能是指pyspark.sql.functions.concat_ws,這是一個函數,用於將多個輸鎮虧入字元串列用給定的分隔符連接成一個單獨的字元串列。sals_wb可能是指Sal』s Shipping problem,這是一個Codecademy上的Python 3模塊中的練習題。也有可能是指御雹神sw_sals.m,這是一個用於計算海水鹽度的Matlab函數。你可以根據你肆悶的具體需求和代碼來判斷你想要了解的是哪一個。
㈢ python怎麼讀寫當前的excel
python有很強大的excel讀寫能力,只需要安裝xlrd,xlwt這兩個庫就可以了
pipinstallxlrd
Pipinstallxlwt
看教程,在右邊的鏈接:網頁鏈接
#ecoding=utf-8
importsys
reload(sys)
sys.setdefaultencoding('utf-8')
frompyExceleratorimport*
w=Workbook()#創建一個工作簿
ws=w.add_sheet('1')#創建一個工作表
forjinrange(0,5):#控制列
foriinrange(0,50000):#控制行
if(j==0):#第一列
ws.write(i,j,'13001454722')
if(j==1):
ws.write(i,j,'6')
if(j==2):
ws.write(i,j,'KQ_201801_20WANONE')
if(j==3):
ws.write(i,j,'1')
if(j==4):
ws.write(i,j,u'否')
w.save('xqtest.xls')
㈣ 如何用python獲取websocket數據
這里,介紹如何使用 Python 與前端 js 進行通信。
websocket 使用 HTTP 協議完成握手之後,不通過 HTTP 直接進行 websocket 通信。
於是,使用 websocket 大致兩個步驟:使用 HTTP 握手,通信。
js 處理 websocket 要使用 ws 模塊; python 處理則使用 socket 模塊建立 TCP 連接即可,比一般的 socket ,只多一個握手以及數據處理的步驟。
握手
過程
包格式
js 客戶端先向伺服器端 python 發送握手包,格式如下:
?
1
2
3
4
5
6
7
8
GET
/chat HTTP/1.1
Host:
server.example.com
Upgrade:
websocket
Connection:
Upgrade
Sec-WebSocket-Key:
dGhlIHNhbXBsZSBub25jZQ==
Origin:
Sec-WebSocket-Protocol:
chat, superchat
Sec-WebSocket-Version:
13
伺服器回應包格式:
?
1
2
3
4
5
HTTP/1.1
101 Switching Protocols
Upgrade:
websocket
Connection:
Upgrade
Sec-WebSocket-Accept:
s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol:
chat
其中, Sec-WebSocket-Key 是隨機的,伺服器用這些數據構造一個 SHA-1 信息摘要。
方法為: key+migic , SHA-1 加密, base-64 加密,如下:
Python 中的處理代碼
?
1
2
MAGIC_STRING='258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
res_key=base64.b64encode(hashlib.sha1(sec_key
+MAGIC_STRING).digest())
握手完整代碼
js 端
js 中有處理 websocket 的類,初始化後自動發送握手包,如下:
var socket = new WebSocket('ws://localhost:3368');
Python 端
Python 用 socket 接受得到握手字元串,處理後發送
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
HOST='localhost'
PORT=3368
MAGIC_STRING='258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
HANDSHAKE_STRING="HTTP/1.1
101 Switching Protocols\r\n"
\
"Upgrade:websocket\r\n"\
"Connection:
Upgrade\r\n"
\
"Sec-WebSocket-Accept:
{1}\r\n"
\
"WebSocket-Location:ws://{2}/chat\r\n"
\
"WebSocket-Protocol:chat\r\n\r\n"
defhandshake(con):
#con為用socket,accept()得到的socket
headers={}
shake=con.recv(1024)
ifnot
len(shake):
returnFalse
header,
data =shake.split('\r\n\r\n',1)
forline
inheader.split('\r\n')[1:]:
key,
val =line.split(':
',1)
headers[key]=val
if'Sec-WebSocket-Key'
not
in
headers:
print('This
socket is not websocket, client close.')
con.close()
returnFalse
sec_key=headers['Sec-WebSocket-Key']
res_key=base64.b64encode(hashlib.sha1(sec_key
+MAGIC_STRING).digest())
str_handshake=HANDSHAKE_STRING.replace('{1}',
res_key).replace('{2}',
HOST +':'
+
str(PORT))
printstr_handshake
con.send(str_handshake)
returnTrue
通信
不同版本的瀏覽器定義的數據幀格式不同, Python 發送和接收時都要處理得到符合格式的數據包,才能通信。
Python 接收
Python 接收到瀏覽器發來的數據,要解析後才能得到其中的有用數據。
瀏覽器包格式
固定位元組:
( 1000 0001 或是 1000 0002 )這里沒用,忽略
包長度位元組:
第一位肯定是 1 ,忽略。剩下 7 個位可以得到一個整數 (0 ~ 127) ,其中
( 1-125 )表此位元組為長度位元組,大小即為長度;
(126)表接下來的兩個位元組才是長度;
(127)表接下來的八個位元組才是長度;
用這種變長的方式表示數據長度,節省數據位。
mark 掩碼:
mark 掩碼為包長之後的 4 個位元組,之後的兄弟數據要與 mark 掩碼做運算才能得到真實的數據。
兄弟數據:
得到真實數據的方法:將兄弟數據的每一位 x ,和掩碼的第 i%4 位做 xor 運算,其中 i 是 x 在兄弟數據中的索引。
完整代碼
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
defrecv_data(self,
num):
try:
all_data=self.con.recv(num)
ifnot
len(all_data):
returnFalse
except:
returnFalse
else:
code_len=ord(all_data[1])
& 127
ifcode_len
==126:
masks=all_data[4:8]
data=all_data[8:]
elifcode_len
==127:
masks=all_data[10:14]
data=all_data[14:]
else:
masks=all_data[2:6]
data=all_data[6:]
raw_str=""
i=0
ford
indata:
raw_str+=chr(ord(d)
^ ord(masks[i%4]))
i+=1
returnraw_str
js 端的 ws 對象,通過 ws.send(str) 即可發送
ws.send(str)
Python 發送
Python 要包數據發送,也需要處理,發送包格式如下
固定位元組:固定的 1000 0001( 『 \x81 ′ )
包長:根據發送數據長度是否超過 125 , 0xFFFF(65535) 來生成 1 個或 3 個或 9 個位元組,來代表數據長度。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
defsend_data(self,
data):
ifdata:
data=str(data)
else:
returnFalse
token="\x81"
length=len(data)
iflength
< 126:
token+=struct.pack("B",
length)
eliflength
<=0xFFFF:
token+=struct.pack("!BH",126,
length)
else:
token+=struct.pack("!BQ",127,
length)
#struct為Python中處理二進制數的模塊,二進制流為C,或網路流的形式。
data='%s%s'
%
(token, data)
self.con.send(data)
returnTrue
js 端通過回調函數 ws.onmessage() 接受數據
?
1
2
3
4
5
ws.onmessage
= function(result,nTime){
alert("從服務端收到的數據:");
alert("最近一次發送數據到現在接收一共使用時間:"+
nTime);
console.log(result);
}
最終代碼
Python服務端
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#
_*_ coding:utf-8 _*_
__author__='Patrick'
importsocket
importthreading
importsys
importos
importMySQLdb
importbase64
importhashlib
importstruct
#
====== config ======
HOST='localhost'
PORT=3368
MAGIC_STRING='258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
HANDSHAKE_STRING="HTTP/1.1
101 Switching Protocols\r\n"
\
"Upgrade:websocket\r\n"\
"Connection:
Upgrade\r\n"
\
"Sec-WebSocket-Accept:
{1}\r\n"
\
"WebSocket-Location:ws://{2}/chat\r\n"
\
"WebSocket-Protocol:chat\r\n\r\n"
classTh(threading.Thread):
def__init__(self,
connection,):
threading.Thread.__init__(self)
self.con=connection
defrun(self):
whileTrue:
try:
pass
self.con.close()
defrecv_data(self,
num):
try:
all_data=self.con.recv(num)
ifnot
len(all_data):
returnFalse
except:
returnFalse
else:
code_len=ord(all_data[1])
& 127
ifcode_len
==126:
masks=all_data[4:8]
data=all_data[8:]
elifcode_len
==127:
masks=all_data[10:14]
data=all_data[14:]
else:
masks=all_data[2:6]
data=all_data[6:]
raw_str=""
i=0
ford
indata:
raw_str+=chr(ord(d)
^ ord(masks[i%4]))
i+=1
returnraw_str
#
send data
defsend_data(self,
data):
ifdata:
data=str(data)
else:
returnFalse
token="\x81"
length=len(data)
iflength
< 126:
token+=struct.pack("B",
length)
eliflength
<=0xFFFF:
token+=struct.pack("!BH",126,
length)
else:
token+=struct.pack("!BQ",127,
length)
#struct為Python中處理二進制數的模塊,二進制流為C,或網路流的形式。
data='%s%s'
%
(token, data)
self.con.send(data)
returnTrue
#
handshake
defhandshake(con):
headers={}
shake=con.recv(1024)
ifnot
len(shake):
returnFalse
header,
data =shake.split('\r\n\r\n',1)
forline
inheader.split('\r\n')[1:]:
key,
val =line.split(':
',1)
headers[key]=val
if'Sec-WebSocket-Key'
not
in
headers:
print('This
socket is not websocket, client close.')
con.close()
returnFalse
sec_key=headers['Sec-WebSocket-Key']
res_key=base64.b64encode(hashlib.sha1(sec_key
+MAGIC_STRING).digest())
str_handshake=HANDSHAKE_STRING.replace('{1}',
res_key).replace('{2}',
HOST +':'
+
str(PORT))
printstr_handshake
con.send(str_handshake)
returnTrue
defnew_service():
"""start
a service socket and listen
when
coms a connection, start a new thread to handle it"""
sock=socket.socket(socket.AF_INET,
socket.SOCK_STREAM)
try:
sock.bind(('localhost',3368))
sock.listen(1000)
#鏈接隊列大小
print"bind
3368,ready to use"
except:
print("Server
is already running,quit")
sys.exit()
whileTrue:
connection,
address =sock.accept()
#返回元組(socket,add),accept調用時會進入waite狀態
print"Got
connection from ",
address
ifhandshake(connection):
print"handshake
success"
try:
t=Th(connection,
layout)
t.start()
print'new
thread for client ...'
except:
print'start
new thread error'
connection.close()
if__name__
=='__main__':
new_service()
js客戶 端
?
1
2
3
4
5
6
7
8
<script>
varsocket
= newWebSocket('ws://localhost:3368');
ws.onmessage
= function(result,nTime){
alert("從服務端收到的數據:");
alert("最近一次發送數據到現在接收一共使用時間:"+
nTime);
console.log(result);
}
</script>
㈤ Python怎麼從文件里的數據去重復,去重復後,再保存到文件里,把重復的數據保存出來
內容讀出來通過逗號分割成一個列表,再去掉重復的,再寫入到文件裡面
#-*-coding:utf-8-*-
filename='data.txt'
withopen(filename,'r')asf:
content=f.read()
content=list(set(content.split(',')))
content=','.join(content)
withopen(filename,'w')as_f:
_f.write(content)
㈥ python怎麼連接websocket
如果只是模擬js端發送接收的話,已經有了websocket server的話,只有client就好了
pip install websocket-client
websocket_client.py(客戶端)
#-*-encoding:utf-8-*-
importsys
sys.path.append("..")
fromsocketimport*
importjson,time,threading
fromwebsocketimportcreate_connection
reload(sys)
sys.setdefaultencoding("utf8")
#config={
#'HOST':'127.0.0.1',
#'PORT':10010
#}
#pipinstallwebsocket-client
classClient():
def__init__(self):
#調用create_connection方法,建立一個websocket鏈接,鏈接是自己的鏈接
self.ws=create_connection("ws://127.0.0.1:10010/xxxx")
#建一個線程,監聽伺服器發送給客戶端的數據
self.trecv=threading.Thread(target=self.recv)
self.trecv.start()
#發送方法,聊天輸入語句時調用,此處默認為群聊ALL
defsend(self,content):
#這里的msg要根據實際需要自己寫
msg={
"type":"POST",
"content":content
}
msg=json.mps(msg)
self.ws.send(msg)
#接收服務端發送給客戶的數據,只要ws處於連接狀態,則一直接收數據
defrecv(self):
try:
whileself.ws.connected:
result=self.ws.recv()
print"receivedmsg:"+str(result)
exceptException,e:
pass
if__name__=='__main__':
c=Client()
#建立鏈接後,就可以按照需要自己send了
c.send(content)
㈦ python 編程
代碼使用python3.x版本,依賴第三方庫openpyxl
安裝openpyxl命令如下:
pipinstallopenpyxl
python代碼如下:
importopenpyxl
importre
INPUT_FILE='input.txt'
OUTPUT_FILE='result.xlsx'
withopen(INPUT_FILE,'r',encoding='utf-8')asf:
wb=openpyxl.Workbook()
ws=wb.active
forlineinf:
words=re.split('[,, ]',line)
vals=words[2:]
forwinvals:
try:
float(w)
exceptValueErrorase:
words.remove(w)
else:
ifwords.count(w)>1:
foriinrange(words.count(w)-1):
words.remove(w)
vals=words[2:]
vals.sort(reverse=True)
iflen(vals)>4:
vals=vals[:3]+vals[-1:]
words=words[:2]+vals
ws.append(words)
wb.save(OUTPUT_FILE)
若代碼格式有亂,請參照下圖:
㈧ Python如何上傳本地視頻
參考代碼如下:
from tkinter import *
from tkinter.ttk import *
from tkinter.filedialog import askopenfile
import time
ws = Tk()
ws.title('PythonGuides')
ws.geometry('400x200')
def open_file():
file_path = askopenfile(mode='r'孫型, filetypes=[('Vedio Files', '*mp4')])
if file_path is not None:
pass
def uploadFiles():
pb1 = Progressbar(
ws,
orient=HORIZONTAL,
length=300,
mode='determinate'
)
pb1.grid(row=4, columnspan=3, pady=20)
for i in range(5):
ws.update_idletasks()
pb1['value'] += 20
time.sleep(1)
pb1.destroy()
Label(ws, text='File Uploaded Successfully!', foreground='green').grid(row=4, columnspan=3, pady=10)
adhar = Label(
ws,
text='Upload Government id in jpg format '
)
adhar.grid(row=0, column=0, padx=10)
adharbtn = Button(
ws,
text ='Choose File',
command = lambda:open_file()
)
adharbtn.grid(row=0, column=1)
dl = Label(
ws,
text='Upload Driving License in jpg format '
)
dl.grid(row=1, column=0, padx=10)
dlbtn = Button(
ws,
text ='Choose File ',
command = lambda:open_file()
)
dlbtn.grid(row=1, column=1)
ms = Label(
ws,
text='Upload Marksheet in jpg format '燃岩
)
ms.grid(row=2, column=0, padx=10)
msbtn = Button(
ws,
text ='Choose File'皮凱御,
command = lambda:open_file()
)
msbtn.grid(row=2, column=1)
upld = Button(
ws,
text='Upload Files',
command=uploadFiles
)
upld.grid(row=3, columnspan=3, pady=10)
ws.mainloop()