簡體   English   中英

如何測試文件是否已由pickle創建?

[英]How to test if a file has been created by pickle?

有什么方法可以檢查文件是否由pickle創建? 我可以捕獲pickle.load引發的異常,但沒有特定的“不是 pickle 文件”異常。

Pickle 文件沒有標題,因此沒有標准的方法來識別它們,除非嘗試 unpickle 並查看這樣做時是否引發了任何異常。

您可以通過子類化pickle模塊中的Pickler()Unpickler()類來定義自己的包含某種標頭的增強協議。 然而,這不能用更快的cPickle模塊完成,因為在其中,它們是工廠函數,不能被子類化[1]

一種更靈活的方法是定義您自己的獨立類,這些類在其實現中使用來自這些模塊之一的相應Pickler()Unpickler()實例。

更新

所有泡菜文件的最后一個字節應該是pickle.STOP操作碼,所以雖然沒有頭,有效地一個很小的拖車這將是一個相對簡單的事情來檢查。

根據您的確切用法,您可能可以通過更復雜的(並且超過一個字節)來補充它,因為任何超過腌制對象表示中STOP操作碼的數據都將被忽略[2]

[1] Python 2 文檔中的腳注 [2]
[2] pickle.loads()文檔,這也適用於pickle.load()因為它目前是根據前者實現的。

除了嘗試解開它並捕獲異常之外,沒有其他確定的方法。

我遇到了這個問題,並找到了一種相當不錯的方法。 您可以使用內置的 pickletools 模塊來解構 pickle 文件並獲取 pickle 操作。 對於 pickle 協議 v2 及更高版本,第一個操作碼將是一個PROTO名稱,而 @martineau 提到的最后一個操作碼是STOP ,以下代碼將顯示這兩個操作碼。 請注意,此示例中的 output 可以迭代,但不能直接訪問操作碼,因此是 for 循環。

import pickletools

with open("file.pickle", "rb") as f:
    pickle = f.read()
    output = pickletools.genops(pickle)
    opcodes = []
    for opcode in output:
        opcodes.append(opcode[0])
    print(opcodes[0].name)
    print(opcodes[-1].name)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM