2016-10-24 42 views
0

我有一堆數據的CSV,我需要更改特定行和列中的數據。我能夠讀取文件,找到需要更改的行,更改數據,但我無法弄清楚如何將更改提交到內存並正確地重新寫入CSV。Python 2.7 - 編輯特定行,列中的CSV

以下代碼不會失敗,但它不正確。我沒有提交對列(col)所做的更改,而是重複了我想要更改的行。數據不變,現在我只有重複的行,我想要更改。

import csv 
import re 
from tempfile import NamedTemporaryFile 
import shutil 

csvName = raw_input("Enter the filename: ") 
tempfile = NamedTemporaryFile(delete=False) 
newSize = 0 
newArea = 0 

with open(csvName, 'rb') as readCSV, tempfile: 
    reader = csv.reader(readCSV) 
    writer = csv.writer(tempfile) 
    for row in reader: 
     for col in row: 
      if col.startswith('Connection:'): 
       print col 
      if col.startswith('Size:'): 
       print "Current", col 
       newSize = raw_input("Enter new size: ") 
       newArea = int(newSize)*int(newSize) 
       col = re.sub('[0-9]+', newSize, col) 
       writer.writerow(row) 
      if col.startswith('Area:'): 
       col = re.sub('[0-9]+', str(newArea), col) 
       writer.writerow(row) 
     writer.writerow(row) 

shutil.move(tempfile.name, csvName) 

這是需要改變數據的一個位的一個示例:

連接:D14Conn 類型:B2B 面積:140 幾何:廣場 區域:19600

我上面的代碼將簡單地將新行復制到此數據中,並且我對col所做的更改未提交 - 如下所示

連接:D14Conn 類型:B2B 尺寸:140 面積:140 幾何圖形:方形 面積:19600 面積:19600

回答

0

row沒有改變。您需要使用新的列值進行new_row,並且執行writer.writerow(new_row)

1

當您將其分配給col時,您正在分配行中col值的副本。在遍歷row時,需要保持對要更改值的索引的引用,並在該索引處更新row,以便在調用writer.writerow(row)時,實際上是使用更改的對象編寫的,或者創建new_row所需的列。 至於你的重複,從你的if塊中刪除writer.writerow(row)調用,它們是多餘的。

+0

我覺得這是我需要做的。所以,我只需要跟蹤我迭代到的哪一行數,然後記下我迭代到的哪一列數,然後更改該行/列的值,對吧? –

+0

'reader'是一個可迭代的對象,所以你不一定會從追蹤行號中受益,但是你不需要每個'row'都只是一個值的數組。所以,如果你正在查看的行中的第3列應該更新,只需說'row [2] = ___',然後你的'writer.writerow(row)'將反映更新 –

+0

所以我理解你的答案,但現在我在執行時遇到問題。似乎csvReader不能跟蹤Row:Column格式中的csv。當我在追蹤迭代的同時嘗試以下代碼時,我最終得到的「列表索引超出範圍」錯誤,我認爲是因爲我試圖引用列號: –