Numpy savez将我的密钥解释为filenames>IOE

2024-06-01 06:15:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用numpy savez作为recommended来保存numpy数组。我使用从中加载数据的文件名作为键。但似乎savez正试图以某种方式使用文件名。我该怎么办?我想避免剥离文件名的路径和结束。在

>>> import numpy
>>> arrs = {'data/a.text': numpy.array([1,2]),
            'data/b.text': numpy.array([3,4]),
            'data/c.text': numpy.array([5,6])}    
>>> numpy.savez('file.npz', **arrs)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/lib/python2.6/dist-packages/numpy/lib/io.py", line 305, in savez
    fid = open(filename,'wb')
IOError: [Errno 2] No such file or directory: '/tmp/data/c.text.npy'

Tags: 数据textinnumpydata文件名libline
2条回答

在将密钥传递给savez函数之前,可以对密钥进行编码和解码。在

>>> import numpy
>>> import base64
>>> arrs = {'data/a.text': numpy.array([1,2]),
            'data/b.text': numpy.array([3,4]),
            'data/c.text': numpy.array([5,6])}
>>> numpy.savez('file.npz', **dict((base64.urlsafe_b64encode(k), v)
                                    for k,v in arrs.iteritems()))
>>> npzfile = numpy.load('file.npz')
>>> decoded = dict((base64.urlsafe_b64decode(k), v)
                   for k,v in npzfile.iteritems())
>>> decoded
{'data/c.text': array([5, 6]),
 'data/a.text': array([1, 2]),
 'data/b.text': array([3, 4])}

可能savez使用dict中给定的名称生成临时文件。文件名中有一个/。当savez创建文件时,它尝试使用给定的名称和扩展名.npy(即data/c.txt.py)作为temp目录中的文件名。但是,新路径导致temp不存在的子目录,从而导致错误。在

解决方案是:要么用其他东西替换斜杠,要么转义文件名。在

(我先前的回答过于复杂,可能是错误的。)

相关问题 更多 >