2015-12-07 75 views
-1

好吧,我有一個csv文件,我需要從每一行抓取信息並操作它以生成距離。在python中操縱csv文件的行

所以這是VBScript編寫

' this is just the set up part - don't worry about it 
Set thepts = document.componentset("points").OwnedTable 
Set theComments = document.ComponentSet("Comments") 

' this is all the code you need 
for each rec1 in thepts.recordset 
for each rec2 in thepts.recordset 
thedist = ((rec1.Data("X (I)") - rec2.Data("X (I)"))^2 - (rec1.Data("Y  (I)") - rec2.Data("Y (I)"))^2) 
theComments.AddText rec1.Data("OBJECTID")&","&rec2.Data("OBJECTID")&","&thedist &vbcrlf 
next 
next 
End Sub 

對不起的代碼,如果上面的代碼看起來糟糕了,我有它保存在記事本,但這裏是我當前的Python代碼看起來像

import csv 
import math 

f = open('citydata.csv') 

csv_f = csv.reader(f) 

for row in csv_f: 
    for row in csv_f: 
    x1 = row[2] 
    x2 = row[3] 
    x1 = float(x1) 
    x2 = float(x2) 
    for row in csv_f: 
     y1 = row[2] 
     y2 = row[3] 
     y1 = float(y1) 
     y2 = float(y2) 
answer = (x1-(math.pow(x2,2)))-(y1-(math.pow(y2,2))) 
print(answer) 

所以我將士(X1-X2^2) - (Y1-Y2 * 2)

和CSV文件是安裝喜歡

第一行= ID IDSP2010 XY長緯度ORIG_FID

然後行的其餘部分將是信息

重要的是唯一的信息

所以,我能想到的是如何做的X和Y下方的數字,它在一個數組的C++中,但我無法用Python包裹我的頭。我從來沒有真正與Python工作之前,請把它簡單,我寫了很多隻是爲了確保你明白了一切我在做,請詢問任何問題,如果你感到困惑,因爲你知道我

+0

我不知道你的實際問題是什麼。什麼部分不起作用?請花些時間閱讀[幫助]和[mcve]。 –

+0

如果你可以用C++數組來做到這一點,爲什麼你不能用python數組呢? –

回答

0

你不明白你要做什麼,但也許這會工作。您當前正在重新使用變量名'row',並且縮進全部是古怪的。此外,你不應該在你的循環中包含第一行(標題)。

import csv 
import math 

f = open('citydata.csv') 

csv_f = csv.reader(f) 
content = [row for row in csv_f] 

for row in content[1:]: 
    x1 = float(row[2]) 
    x2 = float(row[3]) 
    for rowOther in content[1:]: 
     y1 = float(rowOther[2]) 
     y2 = float(rowOther[3]) 

     answer = (x1-(math.pow(x2,2))) - (y1-(math.pow(y2,2))) 

     print(answer) 

編輯:

我才意識到,我認爲你有你的X和Y的一對夫婦的地方交換。試試這個:

import csv 
import math 

f = open('citydata.csv') 

csv_f = csv.reader(f) 
content = [row for row in csv_f] 

for row in content[1:]: 
    x1 = float(row[2]) 
    y1 = float(row[3]) 
    for rowOther in content[1:]: 
     x2 = float(rowOther[2]) 
     y2 = float(rowOther[3]) 

     answer = (x1-(math.pow(x2,2))) - (y1-(math.pow(y2,2))) 

     print(answer) 
+0

是的,[1:]表示它從第二行開始(索引1)。使用rowOther是因爲您在迭代中迭代行,所以'row'和'rowOther'指向彼此不同的行(大多數情況下)。如果你在那裏使用'row',在這種情況下它不一定會影響結果(因爲你已經將行內容分配給新的,不可變的變量),但這是一個不好的先例。 – Tom

+0

好酷很感謝你清理那個。我非常感謝幫助 – user3000195

0

csv_f是一個文件(包裹在一個csv閱讀器)。內部循環將讀取所有內容。一旦達到最後你不能再讀,所以其他循環將停止在那裏。

你想要的是首先將文件中的所有內容複製到內存中(data = [x for x in csv_f]),然後應用相同的算法(在data上)。

此外,在python縮進問題,所以你的公式只在最後計算一次。縮進定義了for循環或if語句的代碼塊。從你的VB腳本看起來就像你想要它計算所有線對。因此,添加製表符/空格來正確對齊(可能也會打印)。

也許你也想刪除最外層的循環,因爲這會導致程序重複文件中每一行的所有內容。