numpy.savez从键中删除前导斜杠

时间:2017-05-25 01:02:59

标签: numpy

我试图保存一堆由数据来自使用savez的绝对文件路径键入的numpy数组。但是,当我使用load来检索该数据时,已从键中删除了前导斜杠。

>>> 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是否期望这种行为?有解决方法还是我做错了什么?

1 个答案:

答案 0 :(得分:1)

看起来剥离是由Python np.lib.npyio._savez模块完成的,可能是在提取而不是写入:

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上,非法字符(:,<,>,|,“,?和*)替换为下划线(_)。

写作在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 的归档。

# https://kojipkgs.fedoraproject.org//packages/cryptopp/5.6.3/8.fc27/data/logs/i686/build.log
# https://kojipkgs.fedoraproject.org//packages/cryptopp/5.6.3/8.fc27/data/logs/x86_64/build.log
if [[ ("$IS_X86" -ne "0") ]]; then
    MARCH_OPT=(-m32 -march=i686)
else
    MARCH_OPT=(-m64 -mtune=generic)
fi

FEDORA_FLAGS=(-DHAVE_CONFIG_H -I. -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2
    -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4
    -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 "${MARCH_OPT[@]}" -fasynchronous-unwind-tables)

"$MAKE" distclean > /dev/null 2>&1

CXX="g++" "$MAKE" "${MAKEARGS[@]}" CXXFLAGS="${FEDORA_FLAGS[@]}" cryptest.exe 2>&1