0

次のような CSV ファイルがあります。

header1, header2, header3, header4
1, 2, 3, abc
4, 5, 6, abc
7, 8, 9, abc

私の目標は、「abc」とマークされた値のみを変更することです。完了したら、ファイルを次のようにします。

header1, header2, header3, header4
1, 2, 3, test
4, 5, 6, test
7, 8, 9, test

これまでに思いついたコードは次のとおりです。

import csv

with open('test2-2.csv', 'w') as csvout:
    write=csv.writer(csvout, delimiter=',', lineterminator='\r')
    with open('test2.csv', 'rb') as csvfile:
        read=csv.reader(csvfile, delimiter=',')
        for row in read:    
            row[3]="test"
            write.writenow(row)

このコードの問題は、「header4」の場所も上書きするため、次のようになることです。

header1, header2, header3, test
1, 2, 3, test
4, 5, 6, test
7, 8, 9, test

変更したいインデックスの場所を指定する方法はありますか?

助けてくれてありがとう!

この例で動作する新しいコードは次のとおりです。

import csv

with open('test2-2.csv', 'w') as csvout:
    write=csv.writer(csvout, delimiter=',', lineterminator='\r')
    with open('test.csv', 'rb') as csvfile:
        read=csv.reader(csvfile, delimiter=',')
        header=next(read)
        write.writerow(header)
        for row in read:    
            row[3]="test"
            write.writerow(row)
4

2 に答える 2

1

ヘッダー行を個別に処理する方法を探しているだけなら、それは非常に簡単です。最初の行を個別に処理するだけです。

with open('test2-2.csv', 'w') as csvout:
    write=csv.writer(csvout, delimiter=',', lineterminator='\r')
    with open('test2.csv', 'rb') as csvfile:
        read=csv.reader(csvfile, delimiter=',')
        header = next(read)
        write.writerow(header)
        for row in read:
            row[3]="test"
            write.writenow(row)

(これには、元のコードと同じバグが残っていることに注意してください。少なくとも 1 つのタイプミス、writenow、欠落skipinitialspace=Trueなどです。)


別のルールで物事を変更したい場合は、別の変換を記述してください。英語で記述できれば、かなり簡単に Python に変換できるはずです。

たとえば6、任意の列のいずれかを次のように変更したい場合test:

for row in read:
    row = ('test' if col == '6' else col for col in row)
    write.writenow(row)

または、行 3 の列 2 を次のように変更したい場合test:

for i, row in enumerate(read):
    if i == 3:
        row[2] = 'test'
    write.writenow(row)

6または、任意の行の列 2 のいずれかを変更する場合:

for i, row in enumerate(read):
    if row[2] == '6':
        row[2] = 'test'
    write.writenow(row)

… 等々。

于 2013-08-28T21:11:59.277 に答える
0

置換コードをifブロックでラップして使用するだけenumerate()です (#added コメントを参照):

import csv

with open('test2-2.csv', 'w') as csvout:
    write=csv.writer(csvout, delimiter=',', lineterminator='\r')
    with open('test2.csv', 'rb') as csvfile:
        read=csv.reader(csvfile, delimiter=',')
        for row in enumerate(read): #modified
            if row[0] >= 1: #added
                row[1][3]="test"
                write.writenow(row)
于 2013-08-28T21:14:11.047 に答える