为什么我只会在后续执行 python 函数时收到此错误?
我正在运行一个 python 脚本,它将一种 netCDF4 文件转换为另一种文件,并通过调用我编写的模块中的函数来完成此操作。
该脚本按顺序处理多个文件。当我到达列表中的第二个文件时,我在函数的这段代码中的“data['time'][:]”处得到一个“IndexError:数据数组的大小不符合切片”:
varobj = cdf.createVariable('time','f8',('time'))
varobj.setncatts(dictifyatts(data['time'],''))
varobj[:] = data['time'][:]
文件是什么并不重要。脚本总是愉快地处理第一个文件,然后在第二个文件中阻塞,例如,它第二次调用失败的函数,第一次是好的。
使用调试器,我发现 varobj[:] 和 data['time'][:] 从第一次调用到第二次调用没有区别。如下:
第二次调用该函数,检查变量显示:
ipdb> data['time']
<class 'netCDF4._netCDF4.Variable'>
float64 time(time)
description: time of measurement
calendar: gregorian
units: seconds since 1970-01-01T00:00:00 UTC
path = /Data/Burst
unlimited dimensions:
current shape = (357060,)
filling off
ipdb> varobj
<class 'netCDF4._netCDF4.Variable'>
float64 time(time)
description: time of measurement
calendar: gregorian
units: seconds since 1970-01-01T00:00:00 UTC
unlimited dimensions:
current shape = (357056,)
filling on, default _FillValue of 9.969209968386869e+36 used
第一次调用该函数时,检查变量会显示完全相同的结果,形状大小相同。
这里也报同样的错误: Error when created variable to create a netCDF file
基于此,我尝试了以下代码:
cf_time = data['time'][:]
cdf.createVariable('time','f8',('time'))
cdf['time'].setncatts(dictifyatts(data['time'],''))
cdf['time'][:] = cf_time[:]
这也不起作用。同样的情况下同样的错误。
我没有想法,可以就下一步检查的内容提出建议。
感谢 Bart 监视形状变化。这是一个很大的线索。我正在检查文件名。
当我调查形状变化时,我发现在我的函数中,其中一个输入变量包含上次调用该函数时的信息。
首先,为什么只有一个输入变量会保留陈旧的信息?
二,这根本不应该发生,它应该超出范围。
我将尝试在最小化的代码中重现此行为,与此同时,将不胜感激有关 python 范围的问题的答案——我想我了解 python 如何处理范围。
这是演示问题的最小代码。调用函数可以以某种方式更改超出范围的变量(good_ens)。
def doFile(infileName, outfileName, goodens, timetype, flen):
print('infilename = %s' % infileName)
print('outfilename = %s' % outfileName)
print('goodens at input are from %d to %d' % (goodens[0],goodens[1]))
print('timetype is %s' % timetype)
maxens = flen # fake file length
print('%s time variable has %d ensembles' % (infileName,maxens))
# TODO - goodens[1] has the file size from the previous file run when multiple files are processed!
if goodens[1] < 0:
goodens[1] = maxens
print('goodens adjusted for input file length are from %d to %d' % (goodens[0],goodens[1]))
nens = goodens[1]-goodens[0]
print('creating new netCDF file %s with %d records (should match input file)' % (outfileName, nens))
datapath = ""
datafiles = ['file0.nc',\
'file1.nc',\
'file2.nc',\
'file3.nc']
# fake file lengths for this demonstration
datalengths = [357056, 357086, 357060, 199866]
outfileroot = 'outfile'
attFile = datapath + 'attfile.txt'
# this gets changed! It should never be changed!
# ask for all ensembles in the file
good_ens = [0,-1]
# -------------- beyond here the user should not need to change things
for filenum in range(len(datafiles)):
print('\n--------------\n')
print('Input Parameters before function call')
print(good_ens)
inputFile = datapath + datafiles[filenum]
print(inputFile)
l = datalengths[filenum]
print(l)
outputFile = datapath + ('%s%03d.cdf' % (outfileroot,filenum))
print(outputFile)
print('Converting from %s to %s' % (inputFile,outputFile))
# the variable good_ens gets changed by this calling function, and should not be
doFile(inputFile, outputFile, good_ens, 'CF', l)
# this works, but will not work for me in using this function
#doNortekRawFile(inputFile, outputFile, [0,-1], 'CF', l)