2016-11-19 2 views
-2

Я написал сценарий для извлечения информации из файла CSV, в зависимости от прежней информации в списках, изменения этой информации и создания окончательного выходного списка.Ошибка скрипта Ошибка

Ошибок не возникает и отлично работает для первой итерации и первой записи списка результатов. Однако результаты других итераций пустые. Я печатал промежуточные результаты между ними, и я просто не могу найти ошибку.

# Definition to convert a date into the day of the year (did not want to use datetime module) 
def doy(month,day,mn,mz): 
    monthlist = [1,2,3,4,5,6,7,8,9,10,11,12] 
    s = 0 

    for m in monthlist: 
     #s = 0 
     if m < int(month): 
      j=0 
      for l in mn: 
       if m in l: 
        s += int(mz[j]) 
       else: 
        j += 1 
     elif m == int(month): 
      s += int(day) 

     else: 
      pass 

    return s 

# Lists of month for the definition above 
month29 = [2] 
month30 = [4,6,9,11] 
month31 = [1,3,5,7,8,10,12] 
md = [month29,month30,month31] 
mm = ["29","30","31"] 

#------------------------------------------------------------------------------------------- 

# Weather as string-Input 
Bsp="Wetter;leicht bewoelkt;sonnig/klare Nacht;sonnig/klare Nacht;mittel bewoelkt;stark bewoelkt;mittel bewoelkt;mittel bewoelkt;mittel bewoelkt;stark bewoelkt;mittel bewoelkt;mittel bewoelkt;stark bewoelkt leichter schneefall;stark bewoelkt leichter schneefall;stark bewoelkt leichter schneefall;stark bewoelkt leichter schneefall;stark bewoelkt leichter schneefall;stark bewoelkt leichter schneefall" 

# Date Input 
final_datum = ["31.03","31.03","31.03","31.03","1.04","1.04","1.04","1.04","2.04","2.04","2.04","2.04","3.04","3.04","3.04","3.04","4.04"] 

# Read the csv-file with radiation values 
fobj_rsunh_SEEG = open("H:\\radiation\\int_SEEG2.csv", "r") 

# Of every 4 identical dates, I just need the two in the middle (31.3,||31.3,31.3||,31,3,...) 
final_datum2 = [] 
for r in range(1,3): 
    fd = final_datum[r::4] 
    final_datum2.append(fd) 
final_datum3=[] 
for h in range(4): 
    for e in final_datum2: 
     final_datum3.append(e[h]) 

# Split the Bsp-string and do the same as with the dates (just get the second and third info of every four entries" 
iswr=Bsp 
iswr = iswr.split(";") 
iswr = iswr[1:] 

iswr2 = [] 
for rr in range(1,3): 
    isw = iswr[r::4] 
    iswr2.append(isw) 
iswr3=[] 
for hh in range(4): 
    for ee in iswr2: 
     iswr3.append(ee[hh]) 

# Define a list for the iteration below 
sbosf = ["stark bewoelkt","stark bewoelkt leichter schneefall","stark bewoelkt mittlerer schneefall","stark bewoelkt viel schneefal","mittel bewoelkt leichter schneefall","mittel_bewoelkt mittlerer schneefall","mittel_bewoelkt viel schneefall","leicht bewoelkt leichter schneefall","leicht bewoelkt mittlerer schneefall","leicht bewoelkt viel schneefall"] 
iswr_ht_list = [] 


k = 0       # k is a index of the iteration 

# depending on the entry of the iswr3-list, I get a different factor called "df" 
for i in iswr3: 
    if i == "sonnig/klare Nacht": 
     df = 1 

    elif i == "leicht bewoelkt": 
     df = 0.75 

    elif i == "mittel bewoelkt": 
     df = 0.5 

    elif i in sbosf: 
     df = 0.25 

    print "Weather = ",i 
    print "df = ",df 
    print "k = ",k 

    # the list of the date and the iswr3 have overlapping infos, that means iswr3[0] happens during final_datum3[0] -> therefore the index k 
    f = final_datum3[k] 
    f = f.split(".") 
    # split date to day and month and use the definition in the beginning of the cript to calculate the day of the year 
    day_f = f[0] 
    month_f = f[1] 
    day_of_year = doy(int(month_f),int(day_f),md,mm) 

    print "Day = ",day_f 
    print "Month = ",month_f 
    print "Day of the year = ",day_of_year 

    # empty lists of half-day values for later on 
    ht1_list = [] 
    ht2_list = [] 

    # read every line of csv file, split each line and define columns as variables: first column is the day of the year, second is time and third is radiation (rd) 
    for line in fobj_rsunh_SEEG: 
     line = line.split(",") 
     dy = line[0] 
     tm = line[1] 
     tmh = tm.split(".") 
     tmhh = tmh[0] 
     rd = line[2] 

     # if the day of the year in the csv-line (first column) is equal to the day of the year of my input list(iswr3), then append the radiation info of that line into list 1 or 2 depending of the half of the day (before or after 13 o`clock) 
     if int(dy) == day_of_year: 

      if int(tmhh) < 13: 
       ht1_list.append(float(rd)) 

      elif int(tmhh) > 12: 
       ht2_list.append(float(rd)) 

    # after the radiation info of one day(final_datum3) in the csv file was split into two lists (day-half 1 and day-half 2), those lists get modified with the factor "df" 
    iswr_ht1 = sum(ht1_list)*df 
    iswr_ht2 = sum(ht2_list)*df 
    print "Day Half 1: ", iswr_ht1 
    print "Day Half 2: ", iswr_ht2 

    # Add the two halfs together to get the radiation of the whole day 
    iswr_gt = iswr_ht1 + iswr_ht2 
    print "Integral of Day ",day_f,"amounts to ",iswr_gt 

    # append that info to the final result list 
    iswr_ht_list.append([day_f,iswr_ht1,iswr_ht2]) 

    # now add 1 to the index to do the same for the next final_datum3 and iswr3 value 
    k += 1 
    print "----------------------------------------------------------------" 

# print final result list 
print "List of Halfday-Values: ",iswr_ht_list 

Моя CSV-файл выглядит следующим образом (день, hour.minutes, радиация):

91,12.00,270.534 
91,12.50,340,678 
91,13.00,764.987 
........ 

Я получаю следующие результаты:

Weather = sonnig/klare Nacht 
df = 1 
k = 0 
Day = 31 
Month = 03 
Day of the year = 91 
Day Half 1: 10480.3028 
Day Half 2: 2699.23143 
Integral of Day 31 amounts to 13179.53423 
---------------------------------------------------------------- 
Weather = sonnig/klare Nacht 
df = 1 
k = 1 
Day = 31 
Month = 03 
Day of the year = 91 
Day Half 1: 0 
Day Half 2: 0 
Integral of Day 31 amounts to 0 
---------------------------------------------------------------- 
...... 
---------------------------------------------------------------- 
List of Halfday-Values: [['31', 10480.3028, 2699.23143], ['31', 0, 0], ['1', 0.0, 0.0], ['1', 0.0, 0.0], ['2', 0.0, 0.0], ['2', 0.0, 0.0], ['3', 0.0, 0.0], ['3', 0.0, 0.0]] 

вы можете увидеть, что первая итерация отлично работает и также находится в последнем списке результатов, но в других итерациях есть полные полные списки и, следовательно, нет интегрального результата.

+3

Сократите это до [mcve]; вы можете ответить на свой вопрос в процессе. – jonrsharpe

+0

Если бы я знал, где проблема, я мог бы дать вам только минимальный код, но для того, чтобы дать вам полный и поддающийся проверке пример без подсказки, где может быть ошибка, я не могу сломать ее ... Im sry –

+0

Это ваша работа **, чтобы выяснить, где проблема, это не аутсорсинг отладки. Изучите основы: https://ericlippert.com/2014/03/05/how-to-debug-small-programs/. Если вы не можете сломать его, не зная больше, чем кто-либо еще об этом коде, зачем ожидать, что кто-то еще проведет свободное время? – jonrsharpe

ответ

0

Используйте программу print() для проверки программы. Или узнайте, как использовать debuger.

Если Day Half 1 дает неправильный результат, тогда проверите расчеты, которые дают это результаты - iswr_ht1 = sum(ht1_list)*df. Используйте print df, ht1_list, ht2_list, и вы видите, что списки пустые.

Теперь у вас есть проверка, почему этот список пуст, поэтому вам нужно найти pleace, где создаются эти списки, и снова использовать print(): значения в переменных; какие части кода выполнены (например, print "i'm in 'if' statemant") и т. д.

Этот список зависит от fobj_rsunh_SEEG поэтому используйте print fobj_rsunh_SEEG.

Это показывает, что fobj_rsunh_SEEG является открытым файлом. Но вы использовали этот файл один раз и читали все данные, поэтому теперь вы читаете их с конца этого файла. Чтобы снова прочитать те же данные, вам нужно снова открыть файл или переместить специальный указатель на начало файла. fobj_rsunh_SEEG.seek(0)

. Просто попробуйте сначала прочитать из файла все данные только один раз и использовать одни и те же данные много раз (без чтения).

Этот список зависит от if int(dy) == day_of_year:, поэтому иногда он дает пустые списки и Day Half 1 = 0. Если это неверно, вам нужно переосмыслить свой код.

+0

Большое спасибо! Я понял! Мне просто нужно было поместить чтение csv-файла в цикл, чтобы я читал его снова и снова, вместо того, чтобы читать пустое окончание файла. –

+0

или читайте один раз в списке, а затем используйте этот список много раз. – furas

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