【问题标题】:How can I write to an existing csv file from a dictionary to a specific column?如何将现有的 csv 文件从字典写入特定列?
【发布时间】:2012-11-19 19:06:46
【问题描述】:

我有一个从 csv 文件创建的字典,并希望使用此字典来更新名为 sheet2.csv 的不同 csv 文件的特定列中的值。

Sheet2.csv 有许多具有不同标题的列,我只需要根据我的字典中的键值对更新列 PartNumber。

我的问题是如何使用 dict 中的键来搜索 sheet2.csv 并仅更新/写入具有适当值的 PartNumber 列?

我是 python 新手,所以我希望这不会太混乱,感谢任何帮助!

这是我用来创建字典的代码:

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 的行,它应该保持不变。所以我需要跳过不在我的字典中的行。

链接到示例 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 单元格......如果这一切令人困惑,我很抱歉!

【问题讨论】:

标签: python excel csv dictionary


【解决方案1】:

下面的代码应该可以解决问题。它首先像您的代码一样构建一个字典,然后逐行读取Sheet2.csv,可能会更新部件号。输出到temp.csv,您可以将其与初始Sheet2.csv 进行比较。如果您想用temp.csv 的内容覆盖Sheet2.csv,只需取消注释shutil.move 即可。

请注意,您提供的示例文件不包含任何可更新数据,因此Sheet2.csvtemp.csv 将是相同的。我用稍微修改过的Sheet1.csv 对此进行了测试,我确保它实际上包含Sheet2.csv 使用的参考ID。

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)

【讨论】:

  • 非常感谢,这正是我所需要的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 2015-10-04
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多