1

csvファイルから作成した辞書があり、このdictを使用して、sheet2.csvという別のcsvファイルの特定の列の値を更新したいと思います。

Sheet2.csvには、ヘッダーが異なる多くの列があり、dictのキーと値のペアに基づいて列PartNumberを更新するだけで済みます。

私の質問は、dictのキーを使用してsheet2.csvを検索し、適切な値を持つPartNumber列のみを更新/書き込みするにはどうすればよいですか?

私はPythonを初めて使用するので、これがあまり混乱しないことを願っています。助けていただければ幸いです。

これは、dictを作成するために使用したコードです。

import csv 
a = open('sheet1.csv', 'rU')
csvReader = csv.DictReader(a)
dict = {}

for line in csvReader:
    dict[line["ReferenceID"]] = line["PartNumber"]
print(dict)    

dict = {'R150': 'PN000123', 'R331': 'PN000873', 'C774': 'PN000064', 'L7896': 'PN000447', 'R0640': 'PN000878', 'R454': 'PN000333'}

さらに混乱させるために、sheet2の既存の行が変更されていないことを確認する必要もあります。たとえば、ReferenceIDがR1234、PartNumberがPN000000の行がある場合、その行は変更されないままである必要があります。したがって、自分のdictにない行をスキップする必要があります。

サンプルCSVへのリンク:

編集:私の質問を言い換えて、より良い例のcsvfileを提供しましょう。

Dict = {'R150':'PN000123'、'R331':'PN000873'、'C774':'PN000064'、'L7896':'PN000447'、'R0640':'PN000878'、'R454があるとしましょう':'PN000333'}。

このcsvファイルに記入する必要があります:https ://www.dropbox.com/s/c95mlitjrvyppef/sheet.csv

具体的には、作成したdictのキーを使用してPartNumber列に入力する必要があります。したがって、ReferenceID列を反復処理し、その値をdictのキーと比較する必要があります。一致するものがある場合は、対応するPartNumberセルにその値を入力する必要があります。これがすべて混乱している場合は申し訳ありません。

4

1 に答える 1

2

以下のコードでうまくいくはずです。最初にコードと同じように辞書を作成し、次にSheet2.csv行ごとに読み取り、場合によっては部品番号を更新します。出力はtemp.csv、最初の値と比較できるようになりますSheet2.csvSheet2.csvの内容で上書きしたい場合はtemp.csv、単に。で行のコメントを外してshutil.moveください。

提供したサンプルファイルには更新可能なデータが含まれていないためSheet2.csvtemp.csv同一であることに注意してください。を少し変更してこれをテストし、でSheet1.csv使用される参照IDが実際に含まれていることを確認しましたSheet2.csv

import csv
import shutil


def createReferenceIdToPartNumberMap(csvToReadPath):
    result = {}
    print 'read part numbers to update from', csvToReadPath
    with open(csvToReadPath, 'rb') as csvInFile:
        csvReader = csv.DictReader(csvInFile)
        for row in csvReader:
            result[row['ReferenceID']] = row['PartNumber']
    return result


def updatePartNumbers(csvToUpdatePath, referenceIdToPartNumberMap):
    tempCsvPath = 'temp.csv'
    print 'update part numbers in', csvToUpdatePath
    with open(csvToUpdatePath, 'rb') as csvInFile:
        csvReader = csv.reader(csvInFile)

        # Figure out which columns contain the reference ID and part number.
        titleRow = csvReader.next()
        referenceIdColumn = titleRow.index('ReferenceID')
        partNumberColumn = titleRow.index('PartNumber')

        # Write tempoary CSV file with updated part numbers.
        with open(tempCsvPath, 'wb') as tempCsvFile:
            csvWriter = csv.writer(tempCsvFile)
            csvWriter.writerow(titleRow)
            for row in csvReader:
                # Check if there is an updated part number.
                referenceId = row[referenceIdColumn]
                newPartNumber = referenceIdToPartNumberMap.get(referenceId)
                # If so, update the row just read accordingly.
                if newPartNumber is not None:
                    row[partNumberColumn] = newPartNumber
                    print '  update part number for %s to %s' % (referenceId, newPartNumber)
                csvWriter.writerow(row)

        # TODO: Move the temporary CSV file over the initial CSV file.
        # shutil.move(tempCsvPath, csvToUpdatePath)


if __name__ == '__main__':
    referenceIdToPartNumberMap = createReferenceIdToPartNumberMap('Sheet1.csv')
    updatePartNumbers('Sheet2.csv', referenceIdToPartNumberMap)
于 2012-12-04T06:33:26.410 に答える