客觀的
通過 python 從駕駛模擬器中獲取資料socket并將其保存到磁盤。
代碼和問題
我首先單擊開始生成資料的模擬器軟體上的“啟動驅動器”按鈕。然后,我通過單擊在 Windows 的 powershell 中運行它的“運行 Python 檔案”在 VSCode 中運行以下代碼。
import socket
import struct
import pandas as pd
from datetime import datetime
UDP_IP = "127.0.0.1"
UDP_PORT = 9000
sock = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT))
appended_data = pd.DataFrame()
while True:
data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
fields = struct.unpack_from('=ddd', data)
d = {'y': fields[0],
'x': fields[1],
'z': fields[2],
'Time': datetime.now()}
df1 = pd.DataFrame([d], columns=d.keys())
appended_data = pd.concat([appended_data, df1])
sock.settimeout(5)
# write DataFrame to an excel sheet
appended_data.reset_index().to_excel('appended.xlsx')
問題
代碼運行成功,您可以看到最后兩個列印輸出如下所示。然后,我在停止生成資料的模擬器軟體上單擊“停止驅動器”。這就是為什么我讓套接字超時,以便它打破回圈。但是在 之后sock.settimeout(5),python 會話結束并且最后一行appended_data.reset_index().to_excel('appended.xlsx')沒有運行。如何讓它運行最后一行,以便將資料保存到 Excel 作業表中?
y x z Time
0 6374.120505 40150.996479 -1.735209 2022-04-21 08:06:16.888265
y x z Time
0 0.0 40150.996479 -1.735209 2022-04-21 08:06:16.910364
Traceback (most recent call last):
File "c:\Users\USERNAME\get_data_from_minisim.py", line 21, in <module>
data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
socket.timeout: timed out
PS C:\Users\USERNAME>
編輯:通過檔案和其他stackoverflow問題后,我想出了以下不成功的
appended_data = pd.DataFrame()
while True:
try:
# time.sleep(5)
data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
fields = struct.unpack_from('=ddd', data)
# print(fields[0],fields[1],fields[2])
d = {'y': fields[0],
'x': fields[1],
'z': fields[2],
'Time': datetime.now()}
df1 = pd.DataFrame([d], columns=d.keys())
print(df1)
appended_data = pd.concat([appended_data, df1])
# print(appended_data)
except:
sock.settimeout(5)
appended_data.reset_index().to_excel('appended.xlsx')
我也試過:
except sock.settimeout(5) as e:
if e == "timed out":
appended_data.reset_index().to_excel('appended.xlsx')
和:
except sock.timeout:
# write DataFrame to an excel sheet
appended_data.reset_index().to_excel('appended.xlsx')
** 但沒有任何效果。** 具體來說,在以后的這些嘗試中單擊“停止駕駛”后,回圈沒有中斷。
您能否指導我如何打破回圈并將其保存appended_data到 excel 中?
uj5u.com熱心網友回復:
假設套接字代碼是正確的,這應該會DataFrame在您的連接超時時保存您:
import socket
import struct
import pandas as pd
from datetime import datetime
UDP_IP = "127.0.0.1"
UDP_PORT = 9000
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # Internet # UDP
sock.bind((UDP_IP, UDP_PORT))
appended_data = pd.DataFrame()
while True:
try:
data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
fields = struct.unpack_from("=ddd", data)
d = {"y": fields[0], "x": fields[1], "z": fields[2], "Time": datetime.now()}
# Also you can clean up your code as you can append dict to your DataFrame, so you can omit creation of "df1"
appended_data = appended_data.append(d, ignore_index=True)
sock.settimeout(5)
except socket.timeout as timeout_exception:
print(f"Lost communication with remote\n{timeout_exception}")
break
# write DataFrame to an excel sheet
appended_data.reset_index().to_excel("appended.xlsx")
附加說明以使您的代碼面向未來,檔案中的示例顯示您應該使用 socket insidewith陳述句,這是一個很好的做法,因為您不必在完成后手動關閉連接。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/462580.html
上一篇:如何在esp8266中接收通過UDP從python發送的結構
下一篇:400錯誤請求套接字
