Skip to content

Commit 6cfad47

Browse files
author
Robert D. Vincent
committed
Test case and more complete fix for missing variable values.
1 parent 9501c09 commit 6cfad47

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

nibabel/externals/netcdf.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,13 @@ def __init__(self, filename, mode='r', mmap=None, version=1):
210210
self.fp = open(self.filename, '%sb' % mode)
211211
if mmap is None:
212212
mmap = True
213+
try:
214+
self.fp.seek(0, 2)
215+
self.file_bytes = self.fp.tell()
216+
self.fp.seek(0)
217+
except ValueError:
218+
self.file_bytes = -1 # Unknown file length (gzip).
219+
213220
self.use_mmap = mmap
214221
self.version_byte = version
215222

@@ -599,18 +606,20 @@ def _read_var_array(self):
599606
else: # not a record variable
600607
# Calculate size to avoid problems with vsize (above)
601608
a_size = reduce(mul, shape, 1) * size
602-
if self.use_mmap:
609+
if self.file_bytes >= 0 and begin_+a_size > self.file_bytes:
610+
data = fromstring(b'\x00'*a_size, dtype=dtype_)
611+
elif self.use_mmap:
603612
mm = mmap(self.fp.fileno(), begin_+a_size, access=ACCESS_READ)
604613
data = ndarray.__new__(ndarray, shape, dtype=dtype_,
605614
buffer=mm, offset=begin_, order=0)
606615
else:
607616
pos = self.fp.tell()
608617
self.fp.seek(begin_)
609-
data = fromstring(self.fp.read(a_size), dtype=dtype_)
610-
# Avoid exception for empty variables.
611-
if data.shape != (0,):
612-
data.shape = shape
613-
618+
buf = self.fp.read(a_size)
619+
if len(buf) < a_size:
620+
buf = b'\x00'*a_size
621+
data = fromstring(buf, dtype=dtype_)
622+
data.shape = shape
614623
self.fp.seek(pos)
615624

616625
# Add variable.

nibabel/tests/data/minc1-no-att.mnc

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)