我有一个我从csv文件创建的字典,并希望使用此dict来更新名为sheet2.csv的不同csv文件的特定列中的值。
Sheet2.csv有许多具有不同标题的列,我只需要根据我的dict中的键值对更新列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单元格....如果这一切都令人困惑,我很抱歉!
答案 0 :(得分:2)
下面的代码可以解决问题。它首先像你的代码一样构建一个字典,然后继续逐行读取Sheet2.csv
,可能会更新部件号。输出转到temp.csv
,您可以将其与初始Sheet2.csv
进行比较。如果您要使用Sheet2.csv
的内容覆盖temp.csv
,只需使用shutil.move
取消注释该行。
请注意,您提供的示例文件不包含任何可更新数据,因此Sheet2.csv
和temp.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)