2017-04-18 73 views
0

我使用多個Python腳本收集數據並將其寫入一個單一的json數據文件。如何防止多python腳本覆蓋相同的文件?

不可能組合腳本。

寫入過程很快,經常發生錯誤(例如一些字符在最後重複),這是致命的,特別是因爲我使用的是json格式。

如果有其他腳本正在嘗試寫入文件,是否有辦法阻止python腳本寫入文件? (這將是絕對OK,如果是,python腳本嘗試寫入到文件中的數據丟失,但該文件的語法不會被莫名其妙地「受傷」是很重要的。)

代碼剪斷:

這將打開該文件,並檢索數據:

data = json.loads(open("data.json").read())

這追加一個新的字典:

data.append(new_dict)

而舊文件被覆蓋:

open("data.json","w").write(json.dumps(data))

信息:data是包含類型的字典列表。

操作系統:漏洞進程發生在Linux服務器上。

+0

這是一個系統相關的問題。在Windows本地驅動器上,寫入時文件被鎖定,因此不能併發寫入。在Linux上,你可以併發寫入。 –

+0

如果你寫了不同的文件,你會如何結合結果?最後一個勝利? –

+0

@ Jean-FrançoisFabre一切都發生在一個linux服務器上 –

回答

0

在Windows上,您可以嘗試創建該文件,並在出現異常時解救出來(因爲文件被另一個腳本鎖定)。但在Linux上,你的方法肯定會失敗。

相反,我會

  • 寫入每個新的字典一個文件,後面添加了進程的ID文件名和反
  • 耗時的過程(ES),不讀一個單一的文件,但排序的文件(根據修改時間)和因此,在每個腳本從它

構建數據:

filename = "data_{}_{}.json".format(os.getpid(),counter) 
counter+=1 
open(filename ,"w").write(json.dumps(new_dict)) 

,並在消費者(閱讀排序文件中的每個字典在受保護的環):

files = sorted(glob.glob("*.json"),key=os.path.getmtime()) 
data = [] 
for f in files: 
    try: 
     with open(f) as fh: 
      data.append(json.load(fh)) 
    except Exception: 
     # IO error, malformed json file: ignore 
     pass 
0

我將發佈自己的解決方案,因爲它爲我工作:

每一個Python腳本檢查(前打開和寫入數據文件)是否存在名爲data_check的文件。如果是這樣的話,pyhthon腳本不會嘗試讀取和寫入文件並關閉應該寫入文件的數據。如果沒有,python腳本創建文件data_check,然後開始讀取和保存文件。寫入過程完成後,文件data_check被刪除。