2016-06-04 2 views
-1

Я использую Python для импорта CSV-файла с координатами в нем, передачи его в список и использования содержащихся данных для расчета площади каждой нерегулярной фигуры , Данные в файле csv выглядят следующим образом.вычисление области нерегулярной формы из координат в файле csv с использованием python

ID Name DE1 DN1 DE2 DN2 DE3 DN3 
88637 Zack Fay -0.026841782 -0.071375637 0.160878583 -0.231788845 0.191811833 0.396593863 
88687 Victory Greenfelder 0.219394372 -0.081932907 0.053054879 -0.048356016  
88737 Lynnette Gorczany 0.043632299 0.118916157 0.005488698 -0.268612073  
88787 Odelia Tremblay PhD 0.083147337 0.152277791 -0.039216388 0.469656787 -0.21725977 0.073797219 

код я использую ниже - однако она воспитывает IndexError: как первая строка не имеет данных во всех колонках. Есть ли способ написать файл csv, поэтому он использует только колоны с данными в них?

import csv 
import math 

def main(): 
    try: 
    # ask user to open a file with coordinates for 4 points 
     my_file = raw_input('Enter the Irregular Differences file name and location: ') 

     file_list = [] 

     with open(my_file, 'r') as my_csv_file: 
      reader = csv.reader(my_csv_file) 
      print 'my_csv_file: ', (my_csv_file) 
      reader.next() 

      for row in reader: 
       print row 
       file_list.append(row) 

     all = calculate(file_list) 
     save_write_file(all) 

    except IOError: 
     print 'File reading error, Goodbye!' 
    except IndexError: 
     print 'Index Error, Check Data' 


# now do your calculations on the 'data' in the file. 

def calculate(my_file): 

return_list = [] 

    for row in my_file: 

     de1 = float(row[2]) 
     dn1 = float(row[3]) 
     de2 = float(row[4]) 
     dn2 = float(row[5]) 
     de3 = float(row[6]) 
     dn3 = float(row[7]) 
     de4 = float(row[8]) 
     dn4 = float(row[9]) 
     de5 = float(row[10]) 
     dn5 = float(row[11]) 
     de6 = float(row[12]) 
     dn6 = float(row[13]) 
     de7 = float(row[14]) 
     dn7 = float(row[15]) 
     de8 = float(row[16]) 
     dn8 = float(row[17]) 
     de9 = float(row[18]) 
     dn9 = float(row[19]) 

     area_squared = abs((dn1 * de2) - (dn2 * de1)) + ((de3 * dn4) - (dn3 * de4)) + ((de5 * dn6) - (de6 * dn5)) + ((de7 * dn8) - (dn7 * de8)) + ((dn9 * de1) - (de9 * dn1)) 
     area = area_squared/2 

     row.append(area) 
     return_list.append(row) 
    return return_list 


def save_write_file(all): 

    with open('output_task4B.csv', 'w') as csvfile: 
     writer = csv.writer(csvfile) 
     writer.writerow(["ID", "Name", "de1", "dn1", "de2", "dn2", "de3", "dn3", "de4", "dn4", "de5", "dn5", "de6", "dn6", "de7", "dn7", "de8", "dn8", "de9", "dn9", "Area"]) 
     writer.writerows(all) 

if __name__ == '__main__': 
    main() 

Любые предложения

+1

Похоже, ваш файл csv не имеет запятых. Это правда, или вы скопировали и ввели экран электронной таблицы вместо фактических данных csv? –

ответ

0

Ваша проблема, как представляется, в функции calculate.

Вы пытаетесь получить доступ к различным индексам row без предварительного подтверждения того, что они существуют. Один наивный подход может рассматривать значения равным нулю, если их нет, за исключением того, что:

+ ((dn9 * de1) - (de9 * dn1) 

попытка обернуть вокруг, и это может привести к аннулированию математику, так как они будут стремиться к нулю.

Лучшим подходом, вероятно, является использование среза строки и использование подхода, повторяющего последовательность, вместо попыток потребовать определенное количество точек. Это позволяет вашему коду соответствовать данным.

coords = row[2:] # skip id and name 

assert len(coords) % 2 == 0, "Coordinates must come in pairs!" 

prev_de = coords[-2] 
prev_dn = coords[-1] 
area_squared = 0.0 

for de, dn in zip(coords[:-1:2], coords[1::2]): 
    area_squared += (de * prev_dn) - (dn * prev_de) 
    prev_de, prev_dn = de, dn 

area = abs(area_squared)/2 

Следующая проблема будет касаться выхода переменной длины. Я бы предложил разместить область перед координатами. Таким образом, вы знаете, что это всегда колонка 3 (или что-то еще).

+0

Спасибо за вашу помощь @AustinHastings теперь работает! –