我写了一个脚本来读取数据并将数据绘制到图表中。我有三个输入文件
wells.csv:我想创建图表的观察井列表
1201
1202
...
well_summary_table.csv:包含每口井的信息(例如参考海拔,水深)
Bore_Name Ref_elev
1201 20
data.csv:包含每个孔的观察数据(例如pH,温度)
RowId Bore_Name深度pH
1 1201 2 7
并非well.csv中的所有井都有绘图数据
我的脚本如下
well_name_list = []
new_depth_list =[]
pH_list = []
from pylab import *
infile = open("wells.csv",'r')
for line in infile:
line=line.strip('\n')
well=line
if not well in well_name_list:
well_name_list.append(well)
infile.close()
for well in well_name_list:
infile1 = open("well_summary_table.csv",'r')
infile2 = open("data.csv",'r')
for line in infile1:
line = line.rstrip()
if not line.startswith('Bore_Name'):
words = line.split(',')
well_name1 = words[0]
if well_name1 == well:
ref_elev = words[1]
for line in infile2:
if not line.startswith("RowId"):
line = line.strip('\n')
words = line.split(',')
well_name2 = words[1]
if well_name2 == well:
depth = words[2]
new_depth = float(ref_elev) - float(depth)
pH = words[3]
new_depth_list.append(float(new_depth))
pH_list.append(float(pH))
fig.plt.figure(figsize = (2,2.7), facecolor='white')
plt.axis([0,8,0,60])
plt.plot(pH_list, new_depth_list, linestyle='', marker = 'o')
plt.savefig(well+'.png')
new_depth_list = []
pH_list = []
infile1.close()
infile2.close()
它适用于我的井列表的一半以上然后停止而不给我任何错误消息。我不知道发生了什么事。任何人都可以帮我解决这个问题吗?对不起,如果这是一个明显的问题。我是新手。
非常感谢,
答案 0 :(得分:2)
@tcaswell发现了一个潜在的问题 - 每次打开它们后你都没有关闭infile1
和infile2
- 你至少会有很多打开的文件句柄,取决于wells.csv
文件中的井数。在某些版本的python中,这可能会导致问题,但这可能不是唯一的问题 - 没有一些测试数据文件很难说。寻找文件的开头可能存在问题 - 当你继续前进到下一个井时回到开头。这可能导致程序按照您的体验运行,但也可能由其他原因引起。您应该使用with
来管理打开文件的范围,从而避免此类问题。
您还应该使用字典将井名与数据结合起来,并在进行绘图之前预先读取所有数据。这样您就可以准确了解自己如何构建数据集以及存在任何问题。
我也在下面提出了一些风格建议。这显然是不完整的,但希望你明白了!
import csv
from pylab import * #imports should always go before declarations
well_details = {} #empty dict
with open('wells.csv','r') as well_file:
well_reader = csv.reader(well_file, delimiter=',')
for row in well_reader:
well_name = row[0]
if not well_details.has_key(well_name):
well_details[well_name] = {} #dict to store pH, depth, ref_elev
with open('well_summary_table.csv','r') as elev_file:
elev_reader = csv.reader(elev_file, delimiter=',')
for row in elev_reader:
well_name = row[0]
if well_details.has_key(well_name):
well_details[well_name]['elev_ref'] = row[1]