【问题标题】:Numpy savez interprets my keys as filenames -> IOErrorNumpy savez 将我的键解释为文件名-> IOError
【发布时间】:2012-02-13 09:23:20
【问题描述】:

我使用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'

【问题讨论】:

  • 嗯,你用c.txt调用numpy.savez,错误是关于c.text
  • 谢谢,我把例子放在一起犯了一个错误。

标签: python numpy


【解决方案1】:

您可以在将密钥传递给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])}

【讨论】:

    【解决方案2】:

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

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

    (我之前的回答太复杂而且可能是错误的。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多