2017-05-31 121 views
2

我想在python 3的csv文件中添加一个新列.csv文件有一个标题行,并且我不需要的前两列这点。其他8列包含4个多边形坐标。我试图添加一个新的列,从csv中的点计算区域。我在堆栈溢出中看到了几个类似的问题,并且试图在我的代码中使用这些信息,但此时只显示了csv的最后一行,我认为该区域也没有正确计算。有什么建议么? (仅供参考,这是我的一个CSV第一码) 这里是我的代码:在python中的csv中新添加的列执行计算

with open(poly.csv, 'rU')as input: 
    with open ('polyout.csv', 'w') as output: 
     writer = csv.writer(output, lineterminator='\n') 
     reader=csv.reader(input) 

     coords=[] 
     row =next(reader) 
     row =next(reader,None) 
     coords=row[2:] 

     prev_de=coords[-2] 
     prev_dn=coords[-1] 
     prev_de=float(prev_de) 
     prev_dn=float(prev_dn) 
     areasq=float(0) 

     for de,dn in zip(coords[:-1:2], coords[1::2]): 
      areasq+= (float(de)*float(prev_dn))-(float(dn)*float(prev_de)) 
      prev_de, prev_dn = de,dn 
      area =abs(areasq)/2 

     for row in reader: 
      row.append(area) 
      coords.append(row) 

     writer.writerows(coords) 

     print(row) 
+0

你可以尝试跳格的第二个? – MattCom

+0

计算列中的不同区域,但不是我所期望的答案......也不知道为什么它只打印csv的最后一行? – Nikki

+0

它打印了csv的最后一行,因为'print'不在'second' for循环中,因此只有在第二个for循环遍历整个csv文件并将'row'设置为最后一行在文件 –

回答

1

我会建议你使用pandas这一点。

import pandas as pd 
df = pd.read_csv('./poly.csv') 
df['area'] = calculate_area(df) # implement calculate_area 
df.write_csv('polyout.csv') 

你可能会更好过其实只是使用普通的numpy,看到这个问题的答案Calculate area of polygon given (x,y) coordinates

+0

不幸的是,我还没有了解熊猫呢所以试图只使用数学和csv – Nikki

+0

这正是我鼓励你学习'熊猫'的原因,因为它会使这些操作变得更容易。不完全确定你的面积计算在做什么,如果你解释'csv'结构,我也可以帮助'calculate_are'实现。 –

+0

,并通过执行'E1_2 * N1_1' - 'N2_2 - E1_1'来计算面积?'_1'和'_2'是csv –

0

我的数据,第一个四边形给出顺时针,第二次给予逆时针

$ cat a.csv 
a,b,x1,y1,x2,y2,x3,y3,x4,y4 
a,b,3,3,3,9,4,9,4,3 
e,f,0,0,5,0,5,5,0,5 
$ 

进口,我也进口stdout能够在屏幕上显示我的 结果

from csv import reader, writer 
from sys import stdout 

使用csv

data = reader(open('a.csv')) 
out = writer(stdout) 

处理头(假设报头的一排)

headers = next(data) 
headers = headers+['A'] 
out.writerow(headers) 

循环上的数据,处理数据,输出处理后的数据

for row in data: 
    # the list comprehension is unpacked in aptly named variables 
    x1, y1, x2, y2, x3, y3, x4, y4 = [int(v) for v in row[2:]] 
    # https://en.wikipedia.org/wiki/Shoelace_formula#Examples 
    a = (x1*y2+x2*y3+x3*y4+x4*y1-y1*x2-y2*x3-y3*x4-y4*x1)/2 
    row.append(a) 
    out.writerow(row) 

我已经保存了abov E在一个名为area.py文件最后我们

$ python3 area.py 
a,b,x1,y1,x2,y2,x3,y3,x4,y4,A 
a,b,3,3,3,9,4,9,4,3,-6.0 
e,f,0,0,5,0,5,5,0,5,25.0 
$ 

要使用鞋带公式记得点必须是有序的顺时针方向,如果你的数据是不同的只是写a = -(...