我有一堆數據的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
我覺得這是我需要做的。所以,我只需要跟蹤我迭代到的哪一行數,然後記下我迭代到的哪一列數,然後更改該行/列的值,對吧? –
'reader'是一個可迭代的對象,所以你不一定會從追蹤行號中受益,但是你不需要每個'row'都只是一個值的數組。所以,如果你正在查看的行中的第3列應該更新,只需說'row [2] = ___',然後你的'writer.writerow(row)'將反映更新 –
所以我理解你的答案,但現在我在執行時遇到問題。似乎csvReader不能跟蹤Row:Column格式中的csv。當我在追蹤迭代的同時嘗試以下代碼時,我最終得到的「列表索引超出範圍」錯誤,我認爲是因爲我試圖引用列號: –