我有一个包含许多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.npy
,file2.npy
,...)。我想在文件系统上单独加载它们而不提取zip文件。我尝试了很多东西,但我无法理解。
我的猜测是:
file3.npy
有什么想法吗?
答案 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
可以对lazy
个zip
个文件执行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)))