2012-12-01 2 views
1

나는 csv 파일에서 만든 사전을 가지고 있으며이 dict를 사용하여 sheet2.csv라는 다른 csv 파일의 특정 열에있는 값을 업데이트하려고합니다.사전에서 특정 열에 기존 csv 파일에 어떻게 쓸 수 있습니까?

Sheet2.csv에는 여러 헤더가있는 많은 열이 있으며 내 사전의 키 값 쌍을 기준으로 PartNumber 열만 업데이트하면됩니다.

제 질문은 어떻게하면 dict에있는 키를 사용하여 sheet2.csv를 검색하고 PartNumber 열만 적절한 값으로 업데이트/쓰기 할 수 있습니까?

나는 이것이 너무 혼란스럽지 않고 도움이 되었기를 바랍니다. 나는 또한 시트 2에서 기존 행이 변경되지 않은 상태로 유지 있는지 확인해야합니다,

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'} 

이 일을 더욱 복잡하게하려면 :

내가 DICT를 만드는 데 사용되는 코드입니다. 예를 들어 ReferenceID가 R1234이고 PartNumber가 PN000000 인 행이있는 경우 변경되지 않습니다. 그래서 나는 내 사전에없는 행을 건너 뛸 필요가있다. 샘플 CSV를에

링크 :

편집 : 내 질문을 바꿔 더 나은 예를 들어 csvfile를 제공하겠습니다.

의가 나는 DICT = { 'R150'을 가지고 있다고 가정 해 봅시다 : 'PN000123', 'R331': 'PN000873', 'C774': 'PN000064', 'L7896': 'PN000447를', 'R0640': 'PN000878 ','R454 ':'PN000333 '}.

는 I이 CSV 파일을 작성해야 https://www.dropbox.com/s/c95mlitjrvyppef/sheet.csv

구체적으로, I는 I 만든 딕셔너리의 키를 사용 PARTNUMBER 열을 작성해야한다. 그래서 열 ReferenceID를 반복하고 그 값을 dict의 키와 비교해야합니다. 일치하는 항목이 있으면 해당 값으로 해당 PartNumber 셀을 채워야합니다 ....이 모든 것이 혼란 스럽다면 미안합니다!

+0

당신은 샘플 sheet1.csv sheet2.csv –

+0

물론, https://www.dropbox.com/s/t4sf2wc8reqwz0e/Sheet1.xlsx 및 https://www.dropbox.com에 대한 링크를 제공 할 수 있습니다 /s/8hdd4ovnywzi3u3/Sheet2.xlsx. – scott0880

+0

Better, https://www.dropbox.com/s/zkagunnm0xgroy5/Sheet1.csv 및 https://www.dropbox.com/s/amb7vr48mdc94v6/Sheet2.csv – scott0880

답변

2

아래 코드는이 트릭을 수행해야합니다. 먼저 코드와 같은 사전을 작성한 다음 행 단위로 Sheet2.csv을 읽고 가능하면 부품 번호를 업데이트합니다. 산출은 temp.csv에 가고 inital Sheet2.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) 
+0

대단히 감사합니다. – scott0880

관련 문제