0

dictCSVファイルのすべての行に適用するマッピングを説明するがあります。

dict1 = {"key1":["value1", "value2"], "key2":["value3"]}

私のプログラムは1つの行を読み取り、特定の列のキーをによって提供される値にマップする必要がありdictます。キーごとに値が1つしかない場合、スクリプトは新しい値を含む行を新しいファイルに書き込む必要があります。キーに複数の値がある場合は、値ごとに1つの新しい行が書き込まれる必要があります。

たとえば、csvin2行が含まれています。key11つの行にはが存在する列があり、もう1つの行にはがありますkey2。この場合、出力ファイルには、事実上3よりも多くの行がcsvout含まれている必要があります。1つの単一の値を除いて、2つの行(に関連付けられている)は同一になります。csvinkey1

私の現在のスクリプトはこれです:

def convSan(sfin, cfout):
    with open(sfin, "rb") as fin:
        with open(cfout, "wb") as fout:
            csvin = csv.reader(fin)
            csvout = csv.writer(fout, delimiter=",")
            fline = csvin.next()
            csvout.writerow(fline)

        for row in csvin:
            row[25] = dict1[row[25]]
            csvout.writerow(row)

これにより、入力ファイルと同じ列数の出力ファイルが生成されますが、すべてのフィールドに正しい新しい値が入力されます(一部のフィールドは値のリストになりました)。

@ sr2222によって提供される答えは、単純なリストの場合には機能しますが、特定の場合には機能させることができません。

ヘルプをいただければ幸いです。

4

2 に答える 2

1

初め:

for index, value in enumerate(list1):
    list1[index] = list2[index]

最初のループをフォーマットするためのよりクリーンな方法です。ただし、これは。と同等list1 = copy.copy(list2)です。私はあなたがやろうとしていることは次のとおりだと思います:

normalized_values = ['123', '456']
content = ['a123', '123', 'b456', '789']
for index, value in enumerate(content):
    for normalized_value in normalized_values:
        if normalized_value in value:
            content[index] = normalized_value

それはあなたに残します:

content = ['123', '123', '456', '789']

質問の更新後に編集:

replacement_map = {'123' : ('a123', '1234'), '456' : ('00456',)}
input = ['123', '456', '234', '123', '789']
output = []
for value in input:
    try:
        output.extend(replacement_map[value])
    except KeyError:
        output.append(value)

try/exceptは次と同等です。

if value in replacement_map:
    output.extend(replacement_map[value])
else:
    output.append(value)

上記のように2つのリストからマップを作成することについてのコメントに応えて(これは、list1とlist2が常に同じ長さであると常に想定できる場合にのみ正しく動作することに注意してください):

replacement_map = {}
for key, value in zip(list1, list2):
    try:
        replacement_map[key].append(value)
    except KeyError:
        replacement_map[key] = [value]
于 2012-07-25T20:06:45.233 に答える
0

興味がある人のために、私はそれを次のように機能させることができました:

def convSan(sfin, cfout):
    with open(sfin, "rb") as fin:
        with open(cfout, "wb") as fout:
            csvin = csv.reader(fin)
            csvout = csv.writer(fout, delimiter=",")
            fline = csvin.next()
            csvout.writerow(fline)
            buff = []

            for row in csvin:
                dl = ce.dict1200[row[25]]
                if len(dl) == 1:
                    row[25] = dl[0]
                    csvout.writerow(row)
                else:
                    for i in range(len(dl)-1):
                        row[25] = dl[i]
                        csvout.writerow(row)

変換は成功し、必要に応じて、入力ファイルに含まれる行が出力ファイルより少なくなります。

于 2012-07-26T01:31:06.487 に答える