从http响应加载numpy数组而不保存文件

时间:2018-10-19 01:09:36

标签: python numpy

我有一堆包含某些URL处的numpy数组的文件(例如https://my_url/my_np_file.npy),我正在尝试将其加载到计算机中。

如果我手动下载文件,则可以使用np.load('file_path')正确加载numpy数组。如果我采用url响应(使用下面的代码),则将内容保存到文件中,然后使用np.load(),它也可以工作。

response, content = http.request('https://my_url/my_np_file.npy')

如果我尝试从内容字符串加载数组,则会出现以下错误。这可能是因为np.load会将输入的字符串解释为文件的名称,而不是数据本身。

  

文件“ /usr/lib/python2.7/dist-packages/numpy/lib/npyio.py”,行   370,在负载中       fid = open(file,“ rb”)TypeError:file()参数1必须是没有空字节的编码字符串,不是str

是否有任何无需保存文件即可加载阵列的方法?

3 个答案:

答案 0 :(得分:3)

您缺少io.BytesIO来使字符串看起来像np.load的文件对象!

以下是您要寻找的内容:

import requests
import io

response = requests.get('https://my_url/my_np_file.npy')
response.raise_for_status()
data = np.load(io.BytesIO(response.content))  # Works!

答案 1 :(得分:1)

我刚刚使用shutil

制定了解决方法
import requests
import shutil
response = requests.get('http://path/to/test.npy', stream=True)

with open('haha.npy', 'wb') as fin:
    shutil.copyfileobj(response.raw, fin)

np.load('haha.npy') # Works!

这将首先自动下载文件本身,但会自动进行。

答案 2 :(得分:0)

您可以添加HTTP响应示例吗? (来自https://my_url/my_np_file.npy

也许您可以尝试np.fromstring

这是上述参考文献中的一个例子。

>>> np.fromstring('1 2', dtype=int, sep=' ')
array([1, 2])
>>> np.fromstring('1, 2', dtype=int, sep=',')
array([1, 2])