2016-10-24 9 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) 

これを変更する必要があるデータの1ビットの例である:

接続:D14Conn タイプ:B2B サイズ:140 ジオメトリ:スクエア エリア:19600

マイ上記のコードは単に新しい行をこのデータに複製し、私がcolに行った変更はコミットされません - 以下のように

接続:D14Conn タイプ:B2B サイズ:140 サイズ:140 ジオメトリ:スクエア エリア:19600 エリア:19600

答えて

0

あなたrowは変更されません。新しい列の値をwriter.writerow(new_row)

1

に割り当てると、rowのcol値のコピーに割り当てられます。 rowを繰り返し実行するときは、変更する値のインデックスを参照して、そのインデックスでrowを更新する必要があります。writer.writerow(row)を呼び出すと、実際に変更されたオブジェクトで書き込むか、new_rowを作成します。希望の列。 重複している場合は、ifブロックからwriter.writerow(row)コールを削除します。これらは冗長です。

+0

私はこれが私がする必要があると思った。だから、私は反復した行番号とそれから反復した列番号を追跡し、その行/列の値を変更するだけです。 –

+0

'reader'は反復可能なオブジェクトなので、行番号を追跡することで必ずしも恩恵を受けるわけではありませんが、それぞれの' row'が単純に値の配列になるため、必要はありません。だから、あなたが見ている行の3番目の列を単に 'row [2] = ___'と言うなら、あなたの 'writer.writerow(row)'は​​更新 –

+0

を反映するでしょう。私は執行に問題があります。 csvReaderがcsvをRow:Column形式で追跡しているようには見えません。繰り返しを追跡しながら次のコードを試してみると、列番号を参照しようとしたために「範囲外のリストインデックス」エラーが発生するだけです。 –

関連する問題