2013-09-10 3 views
1

Я написал сценарий для чтения и построения данных на графиках. У меня есть три входных файловpython перестает работать в середине набора данных

  • wells.csv: список наблюдательных скважин, которые я хочу создать граф

    ...

  • well_summary_table. csv: информация, содержащаяся для каждой скважины (например, эталонная высота, глубина до воды)

    44445164 +10617451515053691368888

    Bore_Name Ref_elev

  • data.csv: содержатся данные наблюдений для каждой скважины (например, рН, Temp)

    RowId Bore_Name Глубина рН

Не все скважины в wells.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

Что вы подразумеваете под "остановками"? Выходит ли программа или только половина сохраненных фигур или что-то еще? Остановляется ли он в одной точке каждый раз? Попробуйте «распечатать» имя скважины, чтобы увидеть, где она остановится, если вы еще не знаете – jozzas

+2

, чтобы закрыть 'infile1' и' infile2' в цикле 'for well ...'. Или еще лучше использовать диспетчер контекста (http://effbot.org/zone/python-with-statement.htm) – tacaswell

+0

Помимо этого, это немного беспорядок анализа данных, который трудно отлаживать без вашего полного набора данных. Если он не слишком большой, я бы предложил разбор ваших файлов один раз и сохранить его в структуре данных в памяти, а затем заговорить об этом. – tacaswell

ответ

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] 
+0

Я не уверен, что это ответ, потому что ОП повторно открывает их в верхней части цикла каждый раз. – tacaswell

+0

@tcaswell, но это утверждение закрывает и снова открывает файл (возможно, нет), выполняя эквивалент 'seek (0)', отбрасывая указатели, чтобы открыть файл и заменить их другими, или что-то еще? Это плохая практика и неопределенное поведение, а построение структуры данных для информации имеет предел удобочитаемости/удобочитаемости. Даже если это явно не решит проблему, моя ставка заключается в том, что она исчезнет или станет очевидной, если вопросник реорганизует свой код. – jozzas

+0

Я не согласен с чем-либо, что вы сказали, но по крайней мере на 2.7 он «делает правильную вещь» и вернет вам результат, который вы наивно ожидаете (подозревайте, что он просто открывает каждый новый дескриптор файла каждый раз). Моя единственная жалоба - это утверждение о том, что неправильное закрытие файлов является основной проблемой. – tacaswell

Смежные вопросы