私は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)
これを変更する必要があるデータの1ビットの例である:
接続:D14Conn タイプ:B2B サイズ:140 ジオメトリ:スクエア エリア:19600
マイ上記のコードは単に新しい行をこのデータに複製し、私がcolに行った変更はコミットされません - 以下のように
接続:D14Conn タイプ:B2B サイズ:140 サイズ:140 ジオメトリ:スクエア エリア:19600 エリア:19600
私はこれが私がする必要があると思った。だから、私は反復した行番号とそれから反復した列番号を追跡し、その行/列の値を変更するだけです。 –
'reader'は反復可能なオブジェクトなので、行番号を追跡することで必ずしも恩恵を受けるわけではありませんが、それぞれの' row'が単純に値の配列になるため、必要はありません。だから、あなたが見ている行の3番目の列を単に 'row [2] = ___'と言うなら、あなたの 'writer.writerow(row)'は更新 –
を反映するでしょう。私は執行に問題があります。 csvReaderがcsvをRow:Column形式で追跡しているようには見えません。繰り返しを追跡しながら次のコードを試してみると、列番号を参照しようとしたために「範囲外のリストインデックス」エラーが発生するだけです。 –