2017-05-25 16 views
0

我想要保存一堆數據來自使用savez的絕對文件路徑的numpy數組。但是,當我使用load來檢索數據時,主鍵的斜線已經從鍵中移除。numpy.savez去掉鍵上的斜線

>>> import numpy as np 
>>> data = {} 
>>> data['/foo/bar'] = np.array([1, 2, 3]) 
>>> data.keys() 
['/foo/bar'] 
>>> np.savez('/tmp/test', **data) 
>>> data2 = np.load('/tmp/test.npz') 
>>> data2.keys() 
['foo/bar'] 

這種行爲預計從numpy.savez?有沒有解決辦法,或者我做錯了什麼?

+2

的'npz'文件是'zip'存檔。鍵是存檔文件名。看看與系統工具存檔。這可能是消毒你們的名字,以適應這個角色。 – hpaulj

+1

是的,好像這是相關的https://stackoverflow.com/questions/9258069/numpy-savez-interprets-my-keys-as-filenames-ioerror – j314erre

+0

誰有'/ foo'根目錄? – hpaulj

回答

1

貌似剝離是由Python zipfile模塊完成,可能在提取物,而不是寫作:

https://docs.python.org/2/library/zipfile.html

注意如果成員文件名是絕對路徑,驅動/ UNC共享點並且前面的(後面)斜線會被剝離,例如:/// foo/bar在Unix上變成foo/bar,而C:\ foo \ bar在Windows上變爲foo \ bar。並且成員文件名中的所有「..」組件都將被刪除,例如:../../foo../../ba..r成爲foo ../ ba..r。在Windows非法字符(:,<,>,|,」和*?)用下劃線(_)代替

寫作是np.lib.npyio._savez完成,第一到tmpfile,然後用zipf.write(tmpfile, arcname=fname)存檔。 。

In [98]: np.savez('test.npz',**{'/foo/bar':arr}) 
In [99]: !unzip -lv test.npz 
Archive: test.npz 
Length Method Size Cmpr Date Time CRC-32 Name 
-------- ------ ------- ---- ---------- ----- -------- ---- 
    152 Stored  152 0% 2017-05-24 19:58 ef792502 foo/bar.npy 
--------   ------- ---       ------- 
    152    152 0%       1 file 
+0

謝謝你回答。我發現這裏的答案使用base64編碼/解碼給了我一個合理的解決方法https://stackoverflow.com/questions/9258069/numpy-savez-interprets-my-keys-as-filenames-ioerror – j314erre