Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Bug in scipy.io.netcdf #232

Closed
wants to merge 1 commit into from

3 participants

@honnorat

Hi,

There is a bug in scipy.io.netcdf when calling sync() or flush(). When writing to disk, the whole Netcdf structure is written, but the file is not rewound. Therefore, the second call to _write() (which can happen when closing the file) just append a second version of the structure after the first one.

This patch just adds a seek(0) before any writing operation.

@pv
Owner
pv commented

Can you add a regression test --- i.e., write a small test program that fails previously, but works after this bugfix?

@honnorat
#!/usr/bin/env python
import os
import scipy.io.netcdf as cdf

f = cdf.netcdf_file('example.nc', mode='w')
x = f.createDimension('x',4)
v = f.createVariable('v', 'i2', ['x'])

v[:] = 1
f.flush()
print "First read  : %d" % os.path.getsize('example.nc')

v[:] = 2
f.flush()
print "Second read : %d" % os.path.getsize('example.nc')

f.close()
print "Last read   : %d" % os.path.getsize('example.nc')

Before the fix:

First read  : 80
Second read : 168
Last read   : 264

After the fix:

First read  : 80
Second read : 88
Last read   : 88
@rgommers
Owner

I converted the above to a regression test. It actually didn't work with numpy 1.7.0-dev (because of http://news.gmane.org/gmane.comp.python.numeric.general), so I fixed the dtype parameter handling as well. Please check if that looks OK: rgommers@76a983e

@rgommers
Owner

I merged this PR and my fix/tests in 7ac86ab, in order to get it in for 0.11.

@rgommers
Owner

Thanks for your contribution Marc.

@rgommers rgommers closed this
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on May 23, 2012
  1. @honnorat
This page is out of date. Refresh to see the latest.
Showing with 1 addition and 0 deletions.
  1. +1 −0  scipy/io/netcdf.py
View
1  scipy/io/netcdf.py
@@ -305,6 +305,7 @@ def flush(self):
sync = flush
def _write(self):
+ self.fp.seek(0)
self.fp.write(asbytes('CDF'))
self.fp.write(array(self.version_byte, '>b').tostring())
Something went wrong with that request. Please try again.