2012-11-22 74 views
1

我正在用一段時間的True循環抓取一個網站,然後用np.savez將所有的數據保存到一個文件中。我想處理npz文件,但文件更新速度比我能複製的速度快。這裏是我的代碼:用Python在np.save中編寫一個大文件while while True Loop

while True: 
    time.sleep(1.5) 
    for post in new: 
    all_posts.append(post) 
    np.savez('records.npz', posts) 
    new = other_site.get_next() 

最初來處理我刮我只是將文件複製到的數據,但現在的文件太大,它被損壞每次。我可以從一開始就重新啓動這個過程,並且保存次數少,這樣我就可以有更多時間進行復制,但是我想知道是否有辦法恢復我寫的數據。我的另一個想法是截斷文件的末尾,使它看起來像一個npz文件,python可以讀取它,但我不知道這是否可能。

+0

'.npz'文件只是'.npy'文件的壓縮文件,因此您可以使用任何zip實用程序處理文件。你問是否有辦法挽救你創建的數據?我不清楚你的問題在哪裏。 –

+0

如果您嘗試恢復截斷的文件,請嘗試'zip -FF --out repaired_file.npz'。您可能丟失了一些數據,但可能能夠恢復大部分數據。 –

回答

0

爲了避免您的文件被踐踏或覆蓋,爲什麼不寫一些python代碼來避免這種情況?例如,您可以爲每個站點保存一個新文件,並將這些文件收集到一個目錄中;

import os 

os.mkdir('scraped_sites') 

while True: 
    time.sleep(1.5) 
    for post in new: 
     all_posts.append(post) 

    # create a unique file path 
    save_file = os.path.join('scraped_sites', 'records_%s.npz' % other_site) 
    np.savez(save_file, all_posts) 

    new = other_site.get_next() 

這樣你的文件將永遠不會被踐踏,所以你不必擔心以前被再次寫入處理它。如果你不喜歡命名你的文件的想法,請檢查tempfile

而且,while True可能是危險的,因爲你的循環永遠不會退出 - 我假設你剛剛寫了這個簡潔,但它會很好有一個breakwhile <conditional,以便在中檔文件寫入時不會意外強制循環退出。