我的Python代码不是从.csv excel文件中提取所有的信息,我找不出原因

我对编码场景相当陌生,而且我的老板刚刚把我扔到了火里,所以我很抱歉,如果这是一个新手的错误,虽然我不这么认为。

所以我试图把G和L1(这不是十一,而是L1)。 数据在我从excel文件中加载的文件中。 excel文件是14×250,所以有14个参数,每个有250个数据点。 我build立的图格式正确,但零值的y值出现。 从我所知道的情况来看,代码是将前12列graphics化,并将最后2列(其中包含两组'y'数据)。 我找不到错误在哪里,这让我疯狂! 任何帮助将不胜感激!

这是我格式化的Excel文件,我相信这个错误是:

header = ['l1', 'l2', 'l3', 'l4', 'l5', 'EI', 'S', 'P_right', 'P1_0', 'P3_0', 'w_left', 'w_right', 'G_left', 'G_right'] def loadfile(filename, skip=[], *args): output = [] with open(filename, *args) as f: reader = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC) for i, row in enumerate(reader): if not(i in skip): output.append(row) return np.array(output) 

这是我真正加载的Excel文件,这是下一个可能的地方有一个错误:

 outputs_l1 = [loadfile('FILE.csv'.format(p)) for p in p3_arr] fig = plt.figure() for output, col in zip(outputs_l1, colors): plt.plot(output[:,0], output[:,10]*1E3, col+'-') plt.legend(['$P3 = {} Pa$'.format(p) for p in p3_arr], loc=(1.05, 0.6), fontsize=16) for output, col in zip(outputs_l1, colors): plt.plot(output[:,0], output[:,11]*1E3, col+'--') plt.ticklabel_format(axis='both', style='plain', scilimits=(-1,1)) plt.xlabel('$l1 (m)$') plt.ylabel('G $(J / m^2) * 10^{-3}$') plt.xlim(xmin=.2) plt.ylim(ymax=2, ymin=0) plt.subplots_adjust(top=0.8, bottom=0.15, right=0.7) 

使用列名称而不是数字并结合两个绘图循环,

 col = {name:i for i,name in enumerate(header)} fig = plt.figure() for data,color in zip(outputs_l1, colors): xs = data[:, col["l1" ]] wl = data[:, col["w_left" ]] * 1000.0 # column 10 wr = data[:, col["w_right"]] * 1000.0 # column 11 plt.plot(xs, wl, color + "-", wr, color + "--") 

一个可能的错误就变得清晰了:你说你想绘制G ,但是你要指定w而不是(列10和列11,而不是列12和列13)。

也许w_leftw_data不会出现,因为它们超出了你指定的限制( plt.ylim(ymax=2, ymin=0) )?

我想你真正想要的是

 fig = plt.figure() for data,color in zip(outputs_l1, colors): xs = data[:, col["l1" ]] gl = data[:, col["G_left" ]] * 1000.0 # column 12 gr = data[:, col["G_right"]] * 1000.0 # column 13 plt.plot(xs, gl, color + "-", gr, color + "--") 

 def loadfile(filename, skip=[], *args): 

作为默认parameter passing[]是有点危险的,因为对默认列表的更改可以在对函数的调用中保持不变,从而导致非常奇怪的结果。 你应该做的

 def loadfile(filename, skip=None, *args): skip = skip or [] 

除了你只使用skip来进行会员testing,所以它会更快,所以它会变成

 def loadfile(filename, skip=None, *args): skip = set(skip or []) 

也,

  output = [] with open(filename, *args) as f: reader = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC) for i, row in enumerate(reader): if not(i in skip): output.append(row) return np.array(output) 

可以缩短到

  with open(filename, *args) as f: cr = csv.reader(f, quoting=csv.QUOTE_NONNUMERIC) return np.array(row for i,row in enumerate(cr) if i not in skip) 

结果是一个numpy二维数组; 所以

 outputs_l1 = [loadfile('FILE.csv'.format(p)) for p in p3_arr] 

看起来像p3_arr是一个列表,确定你想要看哪些数据集; 那么outputs_l1就成了2d数组的列表。 这是一个令人误解的名字,因为,看headerl1应该是每个二维数组的第一列; 因此outputs_l1逻辑上应该是只包含第一列数据的二维数组。 我build议将它重命名为像p_data