I was never able to use nibabel with a zip file, it kept complaining. Instead, I wrote each file out to a temp directory so it would be a real file on the file system. Not graceful, but it works.
# import required modules
import nibabel as nib
import numpy as np
import zipfile
import shutil
working_dir = '/work/nifti_volume/'
my_zip_path = working_dir + 'raw.zip'
temp_dir = working_dir + 'temp'
z = zipfile.ZipFile(my_zip_path, "r")
for filename in z.namelist( ):
if not filename[-1] == '/': # skip over folders in zip file
print('File:', filename)
z.extract(filename, path=temp_dir)
nii = nib.load(temp_dir + '/' + filename)
img = nii.get_fdata()
# Get voxel dimensions
voxel_dims = (nii.header["pixdim"])[1:4]
# Compute volume
nonzero_voxel_count = np.count_nonzero(img)
voxel_volume = np.prod(voxel_dims)
nonzero_voxel_volume = nonzero_voxel_count * voxel_volume
# https://neurostars.org/t/calculate-volumes-counting-voxels-is-a-correct-approach/1433/8
print("Number of non-zero voxels = {}".format(nonzero_voxel_count))
print("Volume of non-zero voxels = {} mm^3".format(nonzero_voxel_volume))
shutil.rmtree(temp_dir)