在zipfile中使用numpy.load文件

时间:2016-05-02 13:08:55

标签: python numpy zipfile

我有一个包含许多npy文件的zipfile(UPDATE [InventoryDatabase].[dbo].[Hardware_Inventory] SET [InventoryDatabase].[dbo].[Hardware_Inventory].ComputerName = [InventoryDatabase].[dbo].[updatepcname].SCCMName FROM [InventoryDatabase].[dbo].[Hardware_Inventory] INNER JOIN [InventoryDatabase].[dbo].[updatepcname] ON [InventoryDatabase].[dbo].[Hardware_Inventory] WHERE [InventoryDatabase].[dbo].[Hardware_Inventory].SerialNumber = [InventoryDatabase].[dbo].[updatepcname].SCCMSerial file1.npyfile2.npy,...)。我想在文件系统上单独加载它们而不提取zip文件。我尝试了很多东西,但我无法理解。

我的猜测是:

file3.npy

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

将2个数组保存到自己的文件中:

In [452]: np.save('x.npy',x)
In [453]: np.save('y.npy',y)

使用文件浏览器工具,创建一个zip文件,然后尝试加载它:

In [454]: np.load('xy.zip')
Out[454]: <numpy.lib.npyio.NpzFile at 0xb48968ec>

看起来np.load检测到zip性质(与名称无关),并返回NpzFile个对象。我们将其分配给变量,然后尝试正常的.npz提取:

In [455]: xy=np.load('xy.zip')

In [456]: xy['x']
Out[456]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

In [457]: xy['y']
Out[457]: 
array([[ 0,  4,  8],
       [ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11]])

因此,load可以对lazyzip个文件执行npy次加载,无论其创建方式如何。

答案 1 :(得分:1)

numpy函数是否期望文件对象,而不是结果文本。对于zip文件,我通常会这样做:

with ZipFile(path, mode='r') as archive:
    with io.BufferedReader(archive.open(filename, mode='r')) as file:

我猜你应该把zipper.open(p,mode =&#39; r&#39;)传递给np.load(f)。另外,我强烈建议您不要执行zipper.read(p),因为它会立即读取内存中的整个文件。因此,使用您的代码约定,请尝试:

with zipfile.ZipFile('myfiles.zip') as zipper:
    for p in zipper.namelist():
        with io.BufferedReader(zipper.open(p, mode='r')) as f:
            a[p] = np.load(f)

答案 2 :(得分:0)

我用BytesIO代替了负载。我不知道它是否有效,但是可以工作并且可读性更强:)

with ZipFile(fname) as z:
    for p in zipper.namelist():
        tmp =  np.load(io.BytesIO(z.read(p)))