From d47c6a9288a3f7219a86e792697bf5ea2f4eb564 Mon Sep 17 00:00:00 2001 From: Mike Taves Date: Fri, 11 Oct 2019 20:05:13 +1300 Subject: [PATCH] refactor(load methods): avoid ResourceWarning with unclosed files * Nam load function already opens each file, so pass the filehandle rather than the filename to each load operation * For each load method, only close the file if it was opened by the method --- flopy/modflow/mf.py | 16 +++++++++------- flopy/modflow/mfbas.py | 7 +++++-- flopy/modflow/mfbcf.py | 6 +++++- flopy/modflow/mfde4.py | 7 ++++++- flopy/modflow/mfdis.py | 7 ++++++- flopy/modflow/mfdisu.py | 6 +++++- flopy/modflow/mfevt.py | 7 ++++++- flopy/modflow/mffhb.py | 6 +++++- flopy/modflow/mfflwob.py | 7 ++++--- flopy/modflow/mfgage.py | 6 +++++- flopy/modflow/mfgmg.py | 8 +++++--- flopy/modflow/mfhfb.py | 8 +++++++- flopy/modflow/mfhob.py | 8 +++++--- flopy/modflow/mfhyd.py | 7 ++++--- flopy/modflow/mflak.py | 6 +++++- flopy/modflow/mflmt.py | 24 +++++++++++++++++------- flopy/modflow/mflpf.py | 7 ++++++- flopy/modflow/mfmlt.py | 7 ++++++- flopy/modflow/mfmnw1.py | 6 +++++- flopy/modflow/mfmnw2.py | 8 ++++++-- flopy/modflow/mfmnwi.py | 6 +++++- flopy/modflow/mfnwt.py | 8 ++++++-- flopy/modflow/mfoc.py | 15 +++++++++------ flopy/modflow/mfpcg.py | 8 +++++--- flopy/modflow/mfpcgn.py | 7 ++++--- flopy/modflow/mfpks.py | 8 +++++--- flopy/modflow/mfpval.py | 6 +++++- flopy/modflow/mfrch.py | 7 ++++++- flopy/modflow/mfsfr2.py | 7 ++++++- flopy/modflow/mfsip.py | 8 +++++--- flopy/modflow/mfsms.py | 6 +++++- flopy/modflow/mfsor.py | 8 +++++--- flopy/modflow/mfstr.py | 6 +++++- flopy/modflow/mfsub.py | 10 +++++++--- flopy/modflow/mfswi2.py | 7 ++++++- flopy/modflow/mfswr1.py | 8 +++++--- flopy/modflow/mfswt.py | 8 +++++--- flopy/modflow/mfupw.py | 7 ++++++- flopy/modflow/mfuzf1.py | 4 +++- flopy/modflow/mfzon.py | 7 ++++++- flopy/modflowlgr/mflgr.py | 10 +++++++--- flopy/mt3d/mt.py | 13 +++++++------ flopy/mt3d/mtadv.py | 6 +++++- flopy/mt3d/mtbtn.py | 7 ++++--- flopy/mt3d/mtcts.py | 6 +++++- flopy/mt3d/mtdsp.py | 6 +++++- flopy/mt3d/mtgcg.py | 6 +++++- flopy/mt3d/mtlkt.py | 6 +++++- flopy/mt3d/mtrct.py | 7 ++++--- flopy/mt3d/mtsft.py | 6 +++++- flopy/mt3d/mtssm.py | 6 +++++- flopy/mt3d/mtuzt.py | 6 +++++- flopy/pakbase.py | 10 +++++++++- flopy/seawat/swtvdf.py | 6 +++++- flopy/seawat/swtvsc.py | 6 +++++- flopy/utils/mfreadnam.py | 8 ++++++-- flopy/utils/optionblock.py | 8 ++++---- flopy/utils/util_array.py | 15 ++++++++++++--- 58 files changed, 334 insertions(+), 119 deletions(-) diff --git a/flopy/modflow/mf.py b/flopy/modflow/mf.py index 800fa734c8..31ea48c9dc 100644 --- a/flopy/modflow/mf.py +++ b/flopy/modflow/mf.py @@ -728,14 +728,14 @@ def load(f, version='mf2005', exe_name='mf2005.exe', verbose=False, if dis_key is None: raise KeyError('discretization entry not found in nam file') disnamdata = ext_unit_dict[dis_key] - dis = disnamdata.package.load(disnamdata.filename, ml, + dis = disnamdata.package.load(disnamdata.filehandle, ml, ext_unit_dict=ext_unit_dict, check=False) files_successfully_loaded.append(disnamdata.filename) if ml.verbose: print(' {:4s} package load...success'.format(dis.name[0])) assert ml.pop_key_list.pop() == dis_key - ext_unit_dict.pop(dis_key) + ext_unit_dict.pop(dis_key).filehandle.close() dis.start_datetime = ml._start_datetime @@ -774,11 +774,11 @@ def load(f, version='mf2005', exe_name='mf2005.exe', verbose=False, if forgive: try: if "check" in package_load_args: - item.package.load(item.filename, ml, + item.package.load(item.filehandle, ml, ext_unit_dict=ext_unit_dict, check=False) else: - item.package.load(item.filename, ml, + item.package.load(item.filehandle, ml, ext_unit_dict=ext_unit_dict) files_successfully_loaded.append(item.filename) if ml.verbose: @@ -795,11 +795,11 @@ def load(f, version='mf2005', exe_name='mf2005.exe', verbose=False, files_not_loaded.append(item.filename) else: if "check" in package_load_args: - item.package.load(item.filename, ml, + item.package.load(item.filehandle, ml, ext_unit_dict=ext_unit_dict, check=False) else: - item.package.load(item.filename, ml, + item.package.load(item.filehandle, ml, ext_unit_dict=ext_unit_dict) files_successfully_loaded.append(item.filename) if ml.verbose: @@ -840,7 +840,9 @@ def load(f, version='mf2005', exe_name='mf2005.exe', verbose=False, for key in ml.pop_key_list: try: ml.remove_external(unit=key) - ext_unit_dict.pop(key) + item = ext_unit_dict.pop(key) + if hasattr(item.filehandle, 'close'): + item.filehandle.close() except KeyError: if ml.verbose: msg = 'Warning: external file unit {} '.format(key) + \ diff --git a/flopy/modflow/mfbas.py b/flopy/modflow/mfbas.py index 96e27119a9..74a06bc6ed 100644 --- a/flopy/modflow/mfbas.py +++ b/flopy/modflow/mfbas.py @@ -302,9 +302,11 @@ def load(f, model, ext_unit_dict=None, check=True, **kwargs): ncol = None # open the file if not already open - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header while True: line = f.readline() @@ -339,7 +341,8 @@ def load(f, model, ext_unit_dict=None, check=True, **kwargs): # dataset 4 -- strt strt = Util3d.load(f, model, (nlay, nrow, ncol), np.float32, 'strt', ext_unit_dict) - f.close() + if openfile: + f.close() # set package unit number unitnumber = None diff --git a/flopy/modflow/mfbcf.py b/flopy/modflow/mfbcf.py index ef823bb033..cec2c20b76 100644 --- a/flopy/modflow/mfbcf.py +++ b/flopy/modflow/mfbcf.py @@ -269,7 +269,8 @@ def load(f, model, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading bcf package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -406,6 +407,9 @@ def load(f, model, ext_unit_dict=None): ext_unit_dict) wetdry[k] = t + if openfile: + f.close() + # set package unit number unitnumber = None filenames = [None, None] diff --git a/flopy/modflow/mfde4.py b/flopy/modflow/mfde4.py index 4104fea61f..11dc4779da 100644 --- a/flopy/modflow/mfde4.py +++ b/flopy/modflow/mfde4.py @@ -239,9 +239,11 @@ def load(f, model, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading de4 package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # read dataset 0 -- header while True: line = f.readline() @@ -277,6 +279,9 @@ def load(f, model, ext_unit_dict=None): hclose = float(line[30:40].strip()) iprd4 = int(line[40:50].strip()) + if openfile: + f.close() + # set package unit number unitnumber = None filenames = [None] diff --git a/flopy/modflow/mfdis.py b/flopy/modflow/mfdis.py index e744b36f31..4f1638336e 100644 --- a/flopy/modflow/mfdis.py +++ b/flopy/modflow/mfdis.py @@ -859,9 +859,11 @@ def load(f, model, ext_unit_dict=None, check=True): if model.verbose: sys.stdout.write('loading dis package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header header = '' while True: @@ -1000,6 +1002,9 @@ def load(f, model, ext_unit_dict=None, check=True): tsmult.append(a3) steady.append(a4) + if openfile: + f.close() + # set package unit number unitnumber = None filenames = [None] diff --git a/flopy/modflow/mfdisu.py b/flopy/modflow/mfdisu.py index c49720eb29..dfc94344de 100644 --- a/flopy/modflow/mfdisu.py +++ b/flopy/modflow/mfdisu.py @@ -459,7 +459,8 @@ def load(f, model, ext_unit_dict=None, check=False): print(msg) model.version = 'mfusg' - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -656,6 +657,9 @@ def load(f, model, ext_unit_dict=None, check=False): print(' TSMULT {}'.format(tsmult)) print(' STEADY {}'.format(steady)) + if openfile: + f.close() + # set package unit number unitnumber = None filenames = [None] diff --git a/flopy/modflow/mfevt.py b/flopy/modflow/mfevt.py index ec3776246a..fd7cb991ff 100644 --- a/flopy/modflow/mfevt.py +++ b/flopy/modflow/mfevt.py @@ -226,9 +226,11 @@ def load(f, model, nper=None, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading evt package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # Dataset 0 -- header while True: line = f.readline() @@ -331,6 +333,9 @@ def load(f, model, nper=None, ext_unit_dict=None): current_ievt = t ievt[iper] = current_ievt + if openfile: + f.close() + # create evt object args = {} if ievt: diff --git a/flopy/modflow/mffhb.py b/flopy/modflow/mffhb.py index 7d0ecec1d1..3005f8b2da 100644 --- a/flopy/modflow/mffhb.py +++ b/flopy/modflow/mffhb.py @@ -423,7 +423,8 @@ def load(f, model, nper=None, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading fhb package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -668,6 +669,9 @@ def load(f, model, nper=None, ext_unit_dict=None): current[n] = tuple(raw[:len(dtype.names)]) ds8.append(current.copy()) + if openfile: + f.close() + # determine specified unit number unitnumber = None filenames = [None, None] diff --git a/flopy/modflow/mfflwob.py b/flopy/modflow/mfflwob.py index beeb08f28d..b2c4417476 100755 --- a/flopy/modflow/mfflwob.py +++ b/flopy/modflow/mfflwob.py @@ -389,7 +389,8 @@ def load(f, model, ext_unit_dict=None, check=True): if model.verbose: sys.stdout.write('loading flwob package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -483,8 +484,8 @@ def load(f, model, ext_unit_dict=None, check=True): column = np.array(column) - 1 factor = np.array(factor) - # close the file - f.close() + if openfile: + f.close() # get ext_unit_dict if none passed if ext_unit_dict is None: diff --git a/flopy/modflow/mfgage.py b/flopy/modflow/mfgage.py index 2b3b543669..184225420b 100644 --- a/flopy/modflow/mfgage.py +++ b/flopy/modflow/mfgage.py @@ -294,7 +294,8 @@ def load(f, model, nper=None, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading gage package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f if sys.version_info[0] == 2: f = open(filename, 'r') @@ -351,6 +352,9 @@ def load(f, model, nper=None, ext_unit_dict=None): files.append(relpth) break + if openfile: + f.close() + # determine specified unit number unitnumber = None filenames = [] diff --git a/flopy/modflow/mfgmg.py b/flopy/modflow/mfgmg.py index 311ab659da..1a0ce0bd9b 100644 --- a/flopy/modflow/mfgmg.py +++ b/flopy/modflow/mfgmg.py @@ -319,9 +319,11 @@ def load(f, model, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading gmg package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header while True: line = f.readline() @@ -358,8 +360,8 @@ def load(f, model, ext_unit_dict=None): t = line.strip().split() relax = float(t[0]) - # close the open file - f.close() + if openfile: + f.close() # determine specified unit number unitnumber = None diff --git a/flopy/modflow/mfhfb.py b/flopy/modflow/mfhfb.py index cab606312c..053196a059 100644 --- a/flopy/modflow/mfhfb.py +++ b/flopy/modflow/mfhfb.py @@ -262,9 +262,11 @@ def load(f, model, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading hfb6 package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header while True: line = f.readline() @@ -360,6 +362,10 @@ def load(f, model, ext_unit_dict=None): else: bnd_output = stack_arrays((bnd_output, par_current), asrecarray=True, usemask=False) + + if openfile: + f.close() + # set package unit number unitnumber = None filenames = [None] diff --git a/flopy/modflow/mfhob.py b/flopy/modflow/mfhob.py index ca34ac74c7..e6039bf637 100755 --- a/flopy/modflow/mfhob.py +++ b/flopy/modflow/mfhob.py @@ -319,9 +319,11 @@ def load(f, model, ext_unit_dict=None, check=True): if model.verbose: sys.stdout.write('loading hob package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header while True: line = f.readline() @@ -417,8 +419,8 @@ def load(f, model, ext_unit_dict=None, check=True): if nobs == nh: break - # close the file - f.close() + if openfile: + f.close() # set package unit number unitnumber = None diff --git a/flopy/modflow/mfhyd.py b/flopy/modflow/mfhyd.py index 4eb4640fb6..031416218a 100644 --- a/flopy/modflow/mfhyd.py +++ b/flopy/modflow/mfhyd.py @@ -299,7 +299,8 @@ def load(f, model, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading hydmod package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -327,8 +328,8 @@ def load(f, model, ext_unit_dict=None): obs['yl'][idx] = float(t[5]) obs['hydlbl'][idx] = t[6].strip() - # close the file - f.close() + if openfile: + f.close() # set package unit number unitnumber = None diff --git a/flopy/modflow/mflak.py b/flopy/modflow/mflak.py index 851626fafc..7665f8a3c5 100644 --- a/flopy/modflow/mflak.py +++ b/flopy/modflow/mflak.py @@ -611,7 +611,8 @@ def load(f, model, nper=None, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading lak package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f if sys.version_info[0] == 2: f = open(filename, 'r') @@ -789,6 +790,9 @@ def load(f, model, nper=None, ext_unit_dict=None): ds9[n] = tds flux_data[iper] = ds9 + if openfile: + f.close() + # convert lake data to Transient3d objects lake_loc = Transient3d(model, (nlay, nrow, ncol), np.int32, lake_loc, name='lakarr_') diff --git a/flopy/modflow/mflmt.py b/flopy/modflow/mflmt.py index 5a6339b35d..1f2e69697c 100644 --- a/flopy/modflow/mflmt.py +++ b/flopy/modflow/mflmt.py @@ -183,19 +183,26 @@ def load(f, model, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading lmt package file...\n') + openfile = not hasattr(f, 'read') + if openfile: + filename = f + f = open(filename, 'r') + elif hasattr(f, 'name'): + filename = f.name + else: + filename = None + # set default values - prefix = os.path.basename(f) - prefix = prefix[:prefix.rfind('.')] - output_file_name = prefix + '.ftl' + if filename: + prefix = os.path.splitext(os.path.basename(filename))[0] + output_file_name = prefix + '.ftl' + else: + output_file_name = model.name + '.ftl' output_file_unit = 333 output_file_header = 'standard' output_file_format = 'unformatted' package_flows = [] - if not hasattr(f, 'read'): - filename = f - f = open(filename, 'r') - for line in f: if line[0] == '#': continue @@ -216,6 +223,9 @@ def load(f, model, ext_unit_dict=None): for i in range(1, len(t)): package_flows.append(t[i]) + if openfile: + f.close() + # determine specified unit number unitnumber = None filenames = [None] diff --git a/flopy/modflow/mflpf.py b/flopy/modflow/mflpf.py index 69883267be..106d513d1e 100644 --- a/flopy/modflow/mflpf.py +++ b/flopy/modflow/mflpf.py @@ -388,9 +388,11 @@ def load(f, model, ext_unit_dict=None, check=True): if model.verbose: sys.stdout.write('loading lpf package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header while True: line = f.readline() @@ -590,6 +592,9 @@ def load(f, model, ext_unit_dict=None, check=True): ext_unit_dict) wetdry[k] = t + if openfile: + f.close() + # set package unit number unitnumber = None filenames = [None, None] diff --git a/flopy/modflow/mfmlt.py b/flopy/modflow/mfmlt.py index a12c51fe57..6d2c94b320 100644 --- a/flopy/modflow/mfmlt.py +++ b/flopy/modflow/mfmlt.py @@ -154,9 +154,11 @@ def load(f, model, nrow=None, ncol=None, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading mult package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header while True: line = f.readline() @@ -202,6 +204,9 @@ def load(f, model, nrow=None, ncol=None, ext_unit_dict=None): t = ModflowMlt.mult_function(mult_dict, line) mult_dict[mltnam] = t + if openfile: + f.close() + # set package unit number unitnumber = None filenames = [None] diff --git a/flopy/modflow/mfmnw1.py b/flopy/modflow/mfmnw1.py index 89f791dd5e..e4ad8731d5 100644 --- a/flopy/modflow/mfmnw1.py +++ b/flopy/modflow/mfmnw1.py @@ -190,7 +190,8 @@ def load(f, model, nper=None, gwt=False, nsol=1, ext_unit_dict=None): nrow, ncol, nlay, nper = model.get_nrow_ncol_nlay_nper() nper = 1 if nper == 0 else nper # otherwise iterations from 0, nper won't run - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -247,6 +248,9 @@ def load(f, model, nper=None, gwt=False, nsol=1, ext_unit_dict=None): spd[n[0]] = tmp[n[0]] stress_period_data[per] = spd + if openfile: + f.close() + return ModflowMnw1(model, mxmnw=mxmnw, ipakcb=ipakcb, iwelpt=iwelpt, nomoiter=nomoiter, kspref=kspref, wel1_bynode_qsum=wel1_bynode_qsum, diff --git a/flopy/modflow/mfmnw2.py b/flopy/modflow/mfmnw2.py index 513298b804..2984f4513d 100644 --- a/flopy/modflow/mfmnw2.py +++ b/flopy/modflow/mfmnw2.py @@ -1206,9 +1206,11 @@ def load(f, model, nper=None, gwt=False, nsol=1, ext_unit_dict=None): nrow, ncol, nlay, nper = model.get_nrow_ncol_nlay_nper() nper = 1 if nper == 0 else nper # otherwise iterations from 0, nper won't run - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 (header) while True: line = next(f) @@ -1266,7 +1268,9 @@ def load(f, model, nper=None, gwt=False, nsol=1, ext_unit_dict=None): mnw[wellid].stress_period_data[per] = \ mnw[wellid].stress_period_data[per - 1] itmp.append(itmp_per) - f.close() + + if openfile: + f.close() # determine specified unit number unitnumber = None diff --git a/flopy/modflow/mfmnwi.py b/flopy/modflow/mfmnwi.py index 7c5b2bda10..1aa5e47ca0 100644 --- a/flopy/modflow/mfmnwi.py +++ b/flopy/modflow/mfmnwi.py @@ -176,7 +176,8 @@ def load(f, model, nper=None, gwt=False, nsol=1, ext_unit_dict=None): # otherwise iterations from 0, nper won't run nper = 1 if nper == 0 else nper - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -210,6 +211,9 @@ def load(f, model, nper=None, gwt=False, nsol=1, ext_unit_dict=None): if unit not in unique_units: unique_units.append(unit) + if openfile: + f.close() + for unit in unique_units: model.add_pop_key_list(unit) diff --git a/flopy/modflow/mfnwt.py b/flopy/modflow/mfnwt.py index f6c1b449a4..d608c815d8 100644 --- a/flopy/modflow/mfnwt.py +++ b/flopy/modflow/mfnwt.py @@ -374,14 +374,18 @@ def load(f, model, ext_unit_dict=None): print(msg) model.version = 'mfnwt' - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') - # dataset 0 -- header # dataset 0 -- header flines = [line.strip() for line in f.readlines() if not line.strip().startswith('#')] + + if openfile: + f.close() + line = flines.pop(0) # dataset 1 diff --git a/flopy/modflow/mfoc.py b/flopy/modflow/mfoc.py index f9bf88f009..57512238f1 100644 --- a/flopy/modflow/mfoc.py +++ b/flopy/modflow/mfoc.py @@ -630,8 +630,8 @@ def get_ocoutput_units(f, ext_unit_dict=None): numericformat = False - # open file - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -688,8 +688,8 @@ def get_ocoutput_units(f, ext_unit_dict=None): if iddnun in ext_unit_dict: fddn = ext_unit_dict[iddnun] - # close the oc file - f.close() + if openfile: + f.close() # return return ihedun, fhead, iddnun, fddn @@ -788,8 +788,8 @@ def load(f, model, nper=None, nstp=None, nlay=None, ext_unit_dict=None): stress_period_data = {} - # open file - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') else: @@ -1004,6 +1004,9 @@ def load(f, model, nper=None, nstp=None, nlay=None, ext_unit_dict=None): kperkstp = (iperoc1 - 1, itsoc1 - 1) stress_period_data[kperkstp] = [] + if openfile: + f.close() + # reset unit numbers unitnumber = [14, 0, 0, 0, 0] if ext_unit_dict is not None: diff --git a/flopy/modflow/mfpcg.py b/flopy/modflow/mfpcg.py index dda6cd4e88..42d95b2b34 100644 --- a/flopy/modflow/mfpcg.py +++ b/flopy/modflow/mfpcg.py @@ -230,9 +230,11 @@ def load(f, model, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading pcg package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header while True: line = f.readline() @@ -305,8 +307,8 @@ def load(f, model, ext_unit_dict=None): if damp < 0.: dampt = float(line[70:80].strip()) - # close the open file - f.close() + if openfile: + f.close() # set package unit number unitnumber = None diff --git a/flopy/modflow/mfpcgn.py b/flopy/modflow/mfpcgn.py index 13833445f3..38fb5171cb 100644 --- a/flopy/modflow/mfpcgn.py +++ b/flopy/modflow/mfpcgn.py @@ -380,7 +380,8 @@ def load(f, model, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading pcgn package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -486,8 +487,8 @@ def load(f, model, ext_unit_dict=None): rate_c = None ipunit = None - # close the open file - f.close() + if openfile: + f.close() # determine specified unit number unitnumber = None diff --git a/flopy/modflow/mfpks.py b/flopy/modflow/mfpks.py index 34c2f67ff1..eb9b2a0cf1 100644 --- a/flopy/modflow/mfpks.py +++ b/flopy/modflow/mfpks.py @@ -231,17 +231,19 @@ def load(f, model, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading pks package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header msg = 3 * ' ' + \ 'Warning: load method not completed. default pks object created.' print(msg) - # close the open file - f.close() + if openfile: + f.close() # set package unit number unitnumber = None diff --git a/flopy/modflow/mfpval.py b/flopy/modflow/mfpval.py index 797221ba85..d6acee15c1 100644 --- a/flopy/modflow/mfpval.py +++ b/flopy/modflow/mfpval.py @@ -159,7 +159,8 @@ def load(f, model, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading pval package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') else: @@ -191,6 +192,9 @@ def load(f, model, ext_unit_dict=None): pval_dict[pvalnam] = float(t[1]) + if openfile: + f.close() + # set package unit number unitnumber = None filenames = [None] diff --git a/flopy/modflow/mfrch.py b/flopy/modflow/mfrch.py index e3ee29c228..e0d6b47463 100644 --- a/flopy/modflow/mfrch.py +++ b/flopy/modflow/mfrch.py @@ -344,9 +344,11 @@ def load(f, model, nper=None, ext_unit_dict=None, check=True): if model.verbose: sys.stdout.write('loading rch package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header while True: line = f.readline() @@ -427,6 +429,9 @@ def load(f, model, nper=None, ext_unit_dict=None, check=True): current_irch = t irch[iper] = current_irch + if openfile: + f.close() + # determine specified unit number unitnumber = None filenames = [None, None] diff --git a/flopy/modflow/mfsfr2.py b/flopy/modflow/mfsfr2.py index 9c6456e1f8..17ffb913e0 100644 --- a/flopy/modflow/mfsfr2.py +++ b/flopy/modflow/mfsfr2.py @@ -749,9 +749,11 @@ def load(f, model, nper=None, gwt=False, nsol=1, ext_unit_dict=None): nper = model.nper nper = 1 if nper == 0 else nper # otherwise iterations from 0, nper won't run - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # Item 0 -- header while True: line = f.readline() @@ -890,6 +892,9 @@ def load(f, model, nper=None, gwt=False, nsol=1, ext_unit_dict=None): else: continue + if openfile: + f.close() + # determine specified unit number unitnumber = None filenames = [None, None, None] diff --git a/flopy/modflow/mfsip.py b/flopy/modflow/mfsip.py index 6720a25017..ceeda009c4 100644 --- a/flopy/modflow/mfsip.py +++ b/flopy/modflow/mfsip.py @@ -194,9 +194,11 @@ def load(f, model, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading sip package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header while True: line = f.readline() @@ -227,8 +229,8 @@ def load(f, model, ext_unit_dict=None): wseed = float(line[30:40].strip()) iprsip = int(line[40:50].strip()) - # close the open file - f.close() + if openfile: + f.close() # set package unit number unitnumber = None diff --git a/flopy/modflow/mfsms.py b/flopy/modflow/mfsms.py index f791fa02df..a8f75e69ab 100644 --- a/flopy/modflow/mfsms.py +++ b/flopy/modflow/mfsms.py @@ -378,7 +378,8 @@ def load(f, model, ext_unit_dict=None): print(msg) model.version = 'mfusg' - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -526,6 +527,9 @@ def load(f, model, ext_unit_dict=None): print(' RCLOSEPCGU {}'.format(rclosepcgu)) print(' RELAXPCGU {}'.format(relaxpcgu)) + if openfile: + f.close() + # set package unit number unitnumber = None filenames = [None] diff --git a/flopy/modflow/mfsor.py b/flopy/modflow/mfsor.py index 964ef0b104..e7f559add6 100644 --- a/flopy/modflow/mfsor.py +++ b/flopy/modflow/mfsor.py @@ -167,17 +167,19 @@ def load(f, model, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading sor package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header msg = 3 * ' ' + 'Warning: load method not completed. ' + \ 'Default sor object created.' print(msg) - # close the open file - f.close() + if openfile: + f.close() # set package unit number unitnumber = None diff --git a/flopy/modflow/mfstr.py b/flopy/modflow/mfstr.py index 5ef34ff445..fb9953912a 100644 --- a/flopy/modflow/mfstr.py +++ b/flopy/modflow/mfstr.py @@ -552,7 +552,8 @@ def load(f, model, nper=None, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading str package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -808,6 +809,9 @@ def load(f, model, nper=None, ext_unit_dict=None): stress_period_data[iper] = bnd_output segment_data[iper] = seg_output + if openfile: + f.close() + # determine specified unit number unitnumber = None filenames = [None, None, None] diff --git a/flopy/modflow/mfsub.py b/flopy/modflow/mfsub.py index 3993584340..244e5f5eae 100644 --- a/flopy/modflow/mfsub.py +++ b/flopy/modflow/mfsub.py @@ -518,9 +518,11 @@ def load(f, model, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading sub package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header while True: line = f.readline() @@ -701,9 +703,11 @@ def load(f, model, ext_unit_dict=None): t = read1d(f, t) t[0:4] -= 1 ids16[k] = t + + if openfile: + f.close() + model.add_pop_key_list(2051) - # close file - f.close() # determine specified unit number unitnumber = None diff --git a/flopy/modflow/mfswi2.py b/flopy/modflow/mfswi2.py index 7944f9a701..9111bdc4a2 100644 --- a/flopy/modflow/mfswi2.py +++ b/flopy/modflow/mfswi2.py @@ -480,9 +480,11 @@ def load(f, model, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading swi2 package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header while True: line = f.readline() @@ -664,6 +666,9 @@ def load(f, model, ext_unit_dict=None): obslrc.append([kk, ii, jj]) nobs = len(obsname) + if openfile: + f.close() + # determine specified unit number unitnumber = None filenames = [None, None, None, None] diff --git a/flopy/modflow/mfswr1.py b/flopy/modflow/mfswr1.py index a352a9f5b3..a2095fe2b6 100644 --- a/flopy/modflow/mfswr1.py +++ b/flopy/modflow/mfswr1.py @@ -152,15 +152,17 @@ def load(f, model, ext_unit_dict=None): sys.stdout.write('loading swr1 process file...\n') # todo: everything - if not hasattr(f, 'read'): + + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') print( 'Warning: load method not completed. default swr1 object created.') - # close open file - f.close() + if openfile: + f.close() # determine specified unit number unitnumber = None diff --git a/flopy/modflow/mfswt.py b/flopy/modflow/mfswt.py index 0a347681f8..fff4a2adfd 100644 --- a/flopy/modflow/mfswt.py +++ b/flopy/modflow/mfswt.py @@ -523,9 +523,11 @@ def load(f, model, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading swt package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header while True: line = f.readline() @@ -704,8 +706,8 @@ def load(f, model, ext_unit_dict=None): t[0:4] -= 1 ids17[k] = t - # close file - f.close() + if openfile: + f.close() # determine specified unit number unitnumber = None diff --git a/flopy/modflow/mfupw.py b/flopy/modflow/mfupw.py index ba192a1740..c0893e9334 100644 --- a/flopy/modflow/mfupw.py +++ b/flopy/modflow/mfupw.py @@ -331,9 +331,11 @@ def load(f, model, ext_unit_dict=None, check=True): print(msg) model.version = 'mfnwt' - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header while True: line = f.readline() @@ -479,6 +481,9 @@ def load(f, model, ext_unit_dict=None, check=True): parm_dict, findlayer=k) vkcb[k] = t + if openfile: + f.close() + # determine specified unit number unitnumber = None filenames = [None, None] diff --git a/flopy/modflow/mfuzf1.py b/flopy/modflow/mfuzf1.py index 08a6ceba48..e67137e85a 100644 --- a/flopy/modflow/mfuzf1.py +++ b/flopy/modflow/mfuzf1.py @@ -769,9 +769,11 @@ def load(f, model, ext_unit_dict=None, check=False): if model.verbose: sys.stdout.write('loading uzf package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header while True: # can't use next() because util2d uses readline() diff --git a/flopy/modflow/mfzon.py b/flopy/modflow/mfzon.py index 437c2973da..36af874ad5 100644 --- a/flopy/modflow/mfzon.py +++ b/flopy/modflow/mfzon.py @@ -157,9 +157,11 @@ def load(f, model, nrow=None, ncol=None, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading zone package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') + # dataset 0 -- header while True: line = f.readline() @@ -194,6 +196,9 @@ def load(f, model, nrow=None, ncol=None, ext_unit_dict=None): model.add_pop_key_list(t.locat) zone_dict[zonnam] = t + if openfile: + f.close() + # set package unit number unitnumber = None filenames = [None] diff --git a/flopy/modflowlgr/mflgr.py b/flopy/modflowlgr/mflgr.py index 8402f1ab7f..022212c53f 100644 --- a/flopy/modflowlgr/mflgr.py +++ b/flopy/modflowlgr/mflgr.py @@ -420,8 +420,8 @@ def load(f, version='mflgr', exe_name='mflgr.exe', verbose=False, Parameters ---------- - f : MODFLOW name file - File to load. + f : filename or file handle + MODFLOW name file to load. model_ws : model workspace path @@ -448,7 +448,8 @@ def load(f, version='mflgr', exe_name='mflgr.exe', verbose=False, else: modelname = f - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = os.path.join(model_ws, f) f = open(filename, 'r') @@ -588,6 +589,9 @@ def load(f, version='mflgr', exe_name='mflgr.exe', verbose=False, load_only=load_only, forgive=forgive, check=check)) + if openfile: + f.close() + lgr = ModflowLgr(version=version, exe_name=exe_name, modelname=modelname, model_ws=model_ws, verbose=verbose, diff --git a/flopy/mt3d/mt.py b/flopy/mt3d/mt.py index 26d098ffbb..d1ec181b58 100644 --- a/flopy/mt3d/mt.py +++ b/flopy/mt3d/mt.py @@ -654,7 +654,7 @@ def load(f, version='mt3dms', exe_name='mt3dms.exe', verbose=False, if mt.verbose: sys.stdout.write(' {:4s} package load...success\n' .format(pck.name[0])) - ext_unit_dict.pop(btn_key) + ext_unit_dict.pop(btn_key).filehandle.close() ncomp = mt.btn.ncomp # reserved unit numbers for .ucn, s.ucn, .obs, .mas, .cnf poss_output_units = set(list(range(201, 201+ncomp)) + @@ -691,7 +691,7 @@ def load(f, version='mt3dms', exe_name='mt3dms.exe', verbose=False, if item.filetype in load_only: if forgive: try: - pck = item.package.load(item.filename, mt, + pck = item.package.load(item.filehandle, mt, ext_unit_dict=ext_unit_dict) files_successfully_loaded.append(item.filename) if mt.verbose: @@ -705,7 +705,7 @@ def load(f, version='mt3dms', exe_name='mt3dms.exe', verbose=False, .format(item.filetype, o)) files_not_loaded.append(item.filename) else: - pck = item.package.load(item.filename, mt, + pck = item.package.load(item.filehandle, mt, ext_unit_dict=ext_unit_dict) files_successfully_loaded.append(item.filename) if mt.verbose: @@ -746,9 +746,10 @@ def load(f, version='mt3dms', exe_name='mt3dms.exe', verbose=False, for key in mt.pop_key_list: try: mt.remove_external(unit=key) - if key != btn_key: # btn_key already popped above - ext_unit_dict.pop(key) - except: + item = ext_unit_dict.pop(key) + if hasattr(item.filehandle, 'close'): + item.filehandle.close() + except KeyError: if mt.verbose: sys.stdout.write( "Warning: external file unit " diff --git a/flopy/mt3d/mtadv.py b/flopy/mt3d/mtadv.py index 61dd9e1a5c..c61ae6ed97 100644 --- a/flopy/mt3d/mtadv.py +++ b/flopy/mt3d/mtadv.py @@ -279,7 +279,8 @@ def load(f, model, ext_unit_dict=None): sys.stdout.write('loading adv package file...\n') # Open file, if necessary - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -372,6 +373,9 @@ def load(f, model, ext_unit_dict=None): if model.verbose: print(' DCHMOC {}'.format(dchmoc)) + if openfile: + f.close() + # set package unit number unitnumber = None filenames = [None] diff --git a/flopy/mt3d/mtbtn.py b/flopy/mt3d/mtbtn.py index ee2fe3efd2..395f1c7e31 100644 --- a/flopy/mt3d/mtbtn.py +++ b/flopy/mt3d/mtbtn.py @@ -660,7 +660,8 @@ def load(f, model, ext_unit_dict=None): >>> btn = flopy.mt3d.Mt3dBtn.load('test.btn', mt) """ - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -947,8 +948,8 @@ def load(f, model, ext_unit_dict=None): print(' TTSMULT {}'.format(ttsmult)) print(' TTSMAX {}'.format(ttsmax)) - # Close the file - f.close() + if openfile: + f.close() # set package unit number unitnumber = None diff --git a/flopy/mt3d/mtcts.py b/flopy/mt3d/mtcts.py index 3274cc7e74..0330c5cf8b 100644 --- a/flopy/mt3d/mtcts.py +++ b/flopy/mt3d/mtcts.py @@ -194,7 +194,8 @@ def load(f, model, nlay=None, nrow=None, ncol=None, nper=None, # sys.stdout.write('loading cts package file...\n') # # # Open file, if necessary - # if not hasattr(f, 'read'): + # openfile = not hasattr(f, 'read') + # if openfile: # filename = f # f = open(filename, 'r') # @@ -249,6 +250,9 @@ def load(f, model, nlay=None, nrow=None, ncol=None, nper=None, # next = int(m_arr[1]) # ninj = int(m_arr[2]) # itrtinj = int(m_arr[3]) + # + # if openfile: + # f.close() @staticmethod def get_default_CTS_dtype(ncomp=1, iforce=0): diff --git a/flopy/mt3d/mtdsp.py b/flopy/mt3d/mtdsp.py index a652162648..777c52de5e 100644 --- a/flopy/mt3d/mtdsp.py +++ b/flopy/mt3d/mtdsp.py @@ -264,7 +264,8 @@ def load(f, model, nlay=None, nrow=None, ncol=None, ext_unit_dict=None): ncol = model.ncol # Open file, if necessary - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -336,6 +337,9 @@ def load(f, model, nlay=None, nrow=None, ncol=None, ext_unit_dict=None): # ext_unit_dict, array_format="mt3d") # kwargs[name] = u2d + if openfile: + f.close() + # set package unit number unitnumber = None filenames = [None] diff --git a/flopy/mt3d/mtgcg.py b/flopy/mt3d/mtgcg.py index 3ae734899f..696703605d 100644 --- a/flopy/mt3d/mtgcg.py +++ b/flopy/mt3d/mtgcg.py @@ -168,7 +168,8 @@ def load(f, model, ext_unit_dict=None): sys.stdout.write('loading gcg package file...\n') # Open file, if necessary - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -205,6 +206,9 @@ def load(f, model, ext_unit_dict=None): print(' CCLOSE {}'.format(cclose)) print(' IPRGCG {}'.format(iprgcg)) + if openfile: + f.close() + # set package unit number unitnumber = None filenames = [None] diff --git a/flopy/mt3d/mtlkt.py b/flopy/mt3d/mtlkt.py index 98392d378d..959fedc241 100644 --- a/flopy/mt3d/mtlkt.py +++ b/flopy/mt3d/mtlkt.py @@ -295,7 +295,8 @@ def load(f, model, nlak=None, nper=None, ncomp=None, ext_unit_dict=None): if model.verbose: sys.stdout.write('loading lkt package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -417,6 +418,9 @@ def load(f, model, nlak=None, nper=None, ncomp=None, ext_unit_dict=None): print(' No transient boundary conditions specified') pass + if openfile: + f.close() + if len(lk_stress_period_data) == 0: lk_stress_period_data = None diff --git a/flopy/mt3d/mtrct.py b/flopy/mt3d/mtrct.py index e8a0fa17eb..77fa91397d 100644 --- a/flopy/mt3d/mtrct.py +++ b/flopy/mt3d/mtrct.py @@ -421,7 +421,8 @@ def load(f, model, nlay=None, nrow=None, ncol=None, ncomp=None, sys.stdout.write('loading rct package file...\n') # Open file, if necessary - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -580,8 +581,8 @@ def load(f, model, nlay=None, nrow=None, ncol=None, ncomp=None, if model.verbose: print(' RC2{} {}'.format(icomp, u3d)) - # Close the file - f.close() + if openfile: + f.close() # set package unit number unitnumber = None diff --git a/flopy/mt3d/mtsft.py b/flopy/mt3d/mtsft.py index 8318222094..8c37f30e61 100644 --- a/flopy/mt3d/mtsft.py +++ b/flopy/mt3d/mtsft.py @@ -458,7 +458,8 @@ def load(f, model, nsfinit=None, nper=None, ncomp=None, if model.verbose: sys.stdout.write('loading sft package file...\n') - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -662,6 +663,9 @@ def load(f, model, nsfinit=None, nper=None, ncomp=None, print(' No transient boundary conditions specified') pass + if openfile: + f.close() + # 1 item for SFT input file, 1 item for SFTOBS file unitnumber = None filenames = [None, None] diff --git a/flopy/mt3d/mtssm.py b/flopy/mt3d/mtssm.py index 9c668bafa5..0ce7edcbe8 100644 --- a/flopy/mt3d/mtssm.py +++ b/flopy/mt3d/mtssm.py @@ -488,7 +488,8 @@ def load(f, model, nlay=None, nrow=None, ncol=None, nper=None, sys.stdout.write('loading ssm package file...\n') # Open file, if necessary - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -701,6 +702,9 @@ def load(f, model, nlay=None, nrow=None, ncol=None, nper=None, current = current.view(np.recarray) stress_period_data[iper] = current + if openfile: + f.close() + # set package unit number unitnumber = None filenames = [None] diff --git a/flopy/mt3d/mtuzt.py b/flopy/mt3d/mtuzt.py index c2ff815fed..74a8692501 100644 --- a/flopy/mt3d/mtuzt.py +++ b/flopy/mt3d/mtuzt.py @@ -381,7 +381,8 @@ def load(f, model, nlay=None, nrow=None, ncol=None, nper=None, print('loading uzt package file...\n') # Open file if necessary - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -600,6 +601,9 @@ def load(f, model, nlay=None, nrow=None, ncol=None, nper=None, '{0:5d}'.format( iper + 1)) + if openfile: + f.close() + unitnumber = None filenames = [None, None] if ext_unit_dict is not None: diff --git a/flopy/pakbase.py b/flopy/pakbase.py index 1f14d86aaf..b15b3b79a7 100644 --- a/flopy/pakbase.py +++ b/flopy/pakbase.py @@ -667,7 +667,8 @@ def load(f, model, pak_type, ext_unit_dict=None, **kwargs): check = True # open the file if not already open - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f if platform.system().lower() == 'windows' and \ sys.version_info[0] < 3: @@ -675,6 +676,10 @@ def load(f, model, pak_type, ext_unit_dict=None, **kwargs): f = io.open(filename, 'r') else: f = open(filename, 'r') + elif hasattr(f, 'name'): + filename = f.name + else: + filename = '?' # set string from pak_type pak_type_str = str(pak_type).lower() @@ -956,6 +961,9 @@ def load(f, model, pak_type, ext_unit_dict=None, **kwargs): dtype = pak_type.get_empty(0, aux_names=aux_names, structured=model.structured).dtype + if openfile: + f.close() + # set package unit number filenames = [None, None] if ext_unit_dict is not None: diff --git a/flopy/seawat/swtvdf.py b/flopy/seawat/swtvdf.py index 336d989815..878eb5f1a5 100644 --- a/flopy/seawat/swtvdf.py +++ b/flopy/seawat/swtvdf.py @@ -346,7 +346,8 @@ def load(f, model, nper=None, ext_unit_dict=None): sys.stdout.write('loading vdf package file...\n') # Open file, if necessary - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -474,6 +475,9 @@ def load(f, model, nper=None, ext_unit_dict=None): # Set indense = 1 because all concentrations converted to density indense = 1 + if openfile: + f.close() + # set package unit number unitnumber = None filenames = [None] diff --git a/flopy/seawat/swtvsc.py b/flopy/seawat/swtvsc.py index 90eec38cf6..f77799df76 100644 --- a/flopy/seawat/swtvsc.py +++ b/flopy/seawat/swtvsc.py @@ -297,7 +297,8 @@ def load(f, model, nper=None, ext_unit_dict=None): sys.stdout.write('loading vsc package file...\n') # Open file, if necessary - if not hasattr(f, 'read'): + openfile = not hasattr(f, 'read') + if openfile: filename = f f = open(filename, 'r') @@ -444,6 +445,9 @@ def load(f, model, nper=None, ext_unit_dict=None): # Set invisc = 1 because all concentrations converted to density invisc = 1 + if openfile: + f.close() + # set package unit number unitnumber = None filenames = [None] diff --git a/flopy/utils/mfreadnam.py b/flopy/utils/mfreadnam.py index 306d41d166..23648df4a7 100644 --- a/flopy/utils/mfreadnam.py +++ b/flopy/utils/mfreadnam.py @@ -179,11 +179,15 @@ def parsenamefile(namfilename, packages, verbose=True): idx = lownams.index(bname.lower()) fname = os.path.join(dn, fls[idx]) # open the file - openmode = 'r' + kwargs = {} if ftype == 'DATA(BINARY)': openmode = 'rb' + else: + openmode = 'r' + if sys.version_info[0] > 2: + kwargs['errors'] = 'replace' try: - filehandle = open(fname, openmode) + filehandle = open(fname, openmode, **kwargs) except IOError: if verbose: print('could not set filehandle to {0:s}'.format(fpath)) diff --git a/flopy/utils/optionblock.py b/flopy/utils/optionblock.py index 630e0f93eb..85260e8b04 100644 --- a/flopy/utils/optionblock.py +++ b/flopy/utils/optionblock.py @@ -333,10 +333,8 @@ def load_options(options, package): """ context = package._options - if hasattr(options, "read"): - pass - - else: + openfile = not hasattr(options, 'read') + if openfile: try: options = open(options, "r") except IOError: @@ -381,6 +379,8 @@ def load_options(options, package): ix += 1 else: + if openfile: + options.close() return OptionBlock(options_line=option_line, package=package) diff --git a/flopy/utils/util_array.py b/flopy/utils/util_array.py index 898594f0da..aafa4f7f9c 100644 --- a/flopy/utils/util_array.py +++ b/flopy/utils/util_array.py @@ -2328,7 +2328,8 @@ def load_block(shape, file_in, dtype): nrow, ncol = shape data = np.ma.zeros(shape, dtype=dtype) data.mask = True - if not hasattr(file_in, 'read'): + openfile = not hasattr(file_in, 'read') + if openfile: file_in = open(file_in, 'r') line = file_in.readline().strip() nblock = int(line.split()[0]) @@ -2341,6 +2342,8 @@ def load_block(shape, file_in, dtype): i1, i2 = int(raw[0]) - 1, int(raw[1]) j1, j2 = int(raw[2]) - 1, int(raw[3]) data[i1:i2, j1:j2] = raw[4] + if openfile: + file_in.close() if data.mask.any(): warn('Util2d.load_block(): blocks do not cover full array') return data.data @@ -2377,7 +2380,8 @@ def load_txt(shape, file_in, dtype, fmtin): raise ValueError( 'Util2d.load_txt(): expected 1 or 2 dimensions, found shape {0}' .format(shape)) - if not hasattr(file_in, 'read'): + openfile = not hasattr(file_in, 'read') + if openfile: file_in = open(file_in, 'r') npl, fmt, width, decimal = ArrayFormat.decode_fortran_descriptor(fmtin) items = [] @@ -2408,6 +2412,8 @@ def load_txt(shape, file_in, dtype, fmtin): items.append(item) except IndexError: break + if openfile: + file_in.close() data = np.fromiter(items, dtype=dtype, count=num_items) if data.size != num_items: raise ValueError('Util2d.load_txt(): expected array size {0},' @@ -2522,13 +2528,16 @@ def load_bin(shape, file_in, dtype, bintype=None): warn('Util2d: setting integer dtype from {0} to int32' .format(dtype)) dtype = np.int32 - if not hasattr(file_in, 'read'): + openfile = not hasattr(file_in, 'read') + if openfile: file_in = open(file_in, 'rb') header_data = None if bintype is not None and np.issubdtype(dtype, np.floating): header_dtype = bf.BinaryHeader.set_dtype(bintype=bintype) header_data = np.fromfile(file_in, dtype=header_dtype, count=1) data = np.fromfile(file_in, dtype=dtype, count=num_items) + if openfile: + file_in.close() if data.size != num_items: raise ValueError('Util2d.load_bin(): expected array size {0},' ' but found size {1}'.format(num_items,