2017-07-02 47 views
-1

第一個python程序。將爲物聯網應用運行一個小設備。想請教如何最好地組織一個小的數據文件,以方便python解析。通過TCP/IP從遠程Web服務器獲取文件。解析簡單文件的值

我有5個整數值Switch0 = 0,交換機1 = 0,交換機2 = 1,交換機3 = 0,開關4 = 5

什麼簡便的一種可靠的方法來組織這個文件,很容易讓蟒蛇解析它? 我該如何解析它?我真的只需要這些值:切換[0,0,1,0,5],但是作爲數字,而不是文本。

感謝

回答

0

Edit: As pointed out by Peteris in comment, pickle is a security risk. Use it carefully.

如果客戶端和服務器上運行的Python腳本,那麼我建議酸洗數據轉換成字典和發送過來。

Pickle是一個可以序列化python對象的python庫。泡菜並傳播。然後取消接收的數據。

簡單的說就是,醃製的二進制文件將使python的讀寫變得容易。如果您使用兩種不同的環境,那麼我不知道是否存在更簡單的方法,而只是使用文本文件。查看documentation

+0

Pickle是一種危險的安全智能格式,只有在您完全控制所有數據時才能使用 - 即,如果客戶端 - 服務器連接已加密並且您完全確定「其他端點」是由您控制的;否則取消攻擊者控制的內容意味着攻擊者可以在你的機器上執行任意代碼。在許多使得醃菜不可用的情況下,以及僅數據格式例如protobuf,json,csv或任意明文編碼會好得多。 – Peteris

+0

的確如此。這似乎是一個愛好項目。所以一個簡單的出路。包括免責聲明。謝謝。 –

1

好吧,如果你把喜歡你的switches.txt文件內容「開關[0,0,1,0,5]」,那麼也許你可以這樣提取出來:

with open('switches.txt', 'r') as f: 
    data=f.read() 

data = data[data.index('[')+1:data.index(']')] 

switches = data.split(',') 

Switch0 = int(switches[0]) 
Switch1 = int(switches[1]) 
Switch2 = int(switches[2]) 
Switch3 = int(switches[3]) 
Switch4 = int(switches[4]) 
+0

謝謝。我正在使用這個。現在我得到錯誤信息:lines = lines [lines.index('[')+ 1:lines.index(']')] Traceback(最近呼叫的最後一個): 文件「」,第1行,in TypeError:類型str不支持緩衝區API我用'type(lines)'測試並得到類'bytes'爲什麼這不起作用?謝謝 – Viking

+0

@Viking類型(行)應該是'str'來使它工作。你最好展示你的代碼。看起來它與我建議的 –

+0

有點不同@你可能以'rb'模式而不是'r'打開你的文件。在這種情況下,它會返回'bytes'而不是'str'。所以你有兩個選擇:或者使用'r'模式,或者使用'str(lines,'utf-8')''或'lines.decode'('utf-8')''將'bytes'轉換爲'str'。 。 –

0

在客戶端方面,你也可以使用gzip來存儲文件。的gzip的用法很簡單:

寫:

import gzip 
content = "Lots of content here" 
with gzip.open('file.txt.gz', 'wb') as f: 
    f.write(content) 

讀:

import gzip 
with gzip.open('file.txt.gz', 'rb') as f: 
    file_content = f.read() 

簽出更多的關於gzip的here

您可以隨時閱讀內容,解析出值並將其寫入文件:

import gzip, re 
content = "Switch0=0,Switch1=0, Switch2=1, Switch3=0, Switch4=5" 
d = dict(re.findall(r'([^=]+)=([^=]+)(?:,|$)', content)) 
values = [v for v in d.values()] 
with gzip.open('file.txt.gz', 'wb') as f: 
    f.write(str(values)) 

這應該只寫入文件的值。使用上面的讀取示例來讀取文件。