[英]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] 。
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.