2017-12-06 126 views
5

bir CSV sahip bir CSV dosyası gibi 2 sahip İki csv dosyası nasıl karşılaştırılır?

FLAGSTAFF AZ 50244.67 5.02 KA1_Podium_Garage_S FLAGSTAFF AZ 33752.13 3.38 KA1_Podium_Garage_S FLAGSTAFF AZ 11965.5 1.2 KA1_Podium_Garage_S FLAGSTAFF AZ 3966.48 0.4 KA1_Podium_Garage_S SEATTLE WA 12646.9 1.26 KA1_Podium_Garage_S SEATTLE WA 225053.92 22.51 KA1_Podium_Garage_S SEATTLE WA 23974.3 2.4 KA1_Podium_Garage_S SEATTLE WA 7036.4 0.7 KA1_Podium_Garage_S SEATTLE WA 3021.93 0.3 KA1_Podium_Garage_S 

gibidir dosya1
,
Alabama  AL 1 
Alaska  AK 2 
Arizona  AZ 4 
Arkansas AR 5 
California CA 6 
Colorado CO 8 
Connecticut CT 9 
SEATTLE  WA 53 

Şimdi CSV file2 CSV üçüncü sütun değeri eklemek gerekir

Bu gibi olmalıdır Örneğin, ikinci sütun

karşılaştırarak file1, ,

AZ kodu AZ, WA benim csv Dosya1 içinde olduğu her yerde 4 WA kodu 53 olduğu, kod

gibi görünmelidir My çıktı, İşte

FLAGSTAFF AZ 50244.67 5.02 KA1_Podium_Garage_S 4 
FLAGSTAFF AZ 33752.13 3.38 KA1_Podium_Garage_S 4 
FLAGSTAFF AZ 11965.5  1.2 KA1_Podium_Garage_S 4 
FLAGSTAFF AZ 3966.48  0.4 KA1_Podium_Garage_S 4 
SEATTLE  WA 12646.9  1.26 KA1_Podium_Garage_S 53 
SEATTLE  WA 225053.92 22.51 KA1_Podium_Garage_S 53 
SEATTLE  WA 23974.3  2.4 KA1_Podium_Garage_S 53 
SEATTLE  WA 7036.4  0.7 KA1_Podium_Garage_S 53 
SEATTLE  WA 3021.93  0.3 KA1_Podium_Garage_S 53 

olduğunu

bir sütuna eklenen almalısınız denedim kod,

with open("/home/sumit/Desktop/CSV_FILE1.csv", "r") as f: 
    first = {rows[1]: rows[0:] for rows in list(csv.reader(f))} 

# compare second csv and append Code 
with open("CSVFILE2.csv", "r") as f1: 
    for row in csv.reader(f1): 
     if row[1] in first: 
      first[row[1]].append(row[2]) 

# convert dict back to list 
merged = [(k,) + tuple(v) for k, v in first.items()] 

# write list to output csv 
with open("output.csv", "w") as f1: 
    csv.writer(f1).writerows(merged) 

Çıktı, gibi alıyorum

AZ FLAGSTAFF AZ 44230.4 4.42 KA1_Podium_Garage_S 4 
WA SEATTLE  WA 45329.3 4.53 KA1_Podium_Garage_S 53 
+0

bir 'dict' sadece her kilit için bir değere sahip olabilir; Birden çok kez farklı değerler içeren bir anahtar eklemeyi denerseniz, yalnızca en son bir –

+0

alacaktır Ben mantığınızı değiştirmenizi öneririm: ikinci CSV dosyanız yalnızca her durumun bir örneğine sahip gibi görünüyor. Bu csv ile anahtarlar: val çiftlerinin durum olduğu bir dict yapmak: numaralar sonra ilk csv boyunca yineleyin ve değerleri gerektiği gibi ekleyin. –

cevap

2

Bu satır, ilk dosyadan eyalet kısaltmasına göre bir sözlük oluşturuyor. Bu yanlış görünüyor, çünkü bir sözlük yalnızca her tuşa sahip olabilir ve örneğin "AZ" ile birden fazla satıra sahip olabilirsiniz.

first = { rows[1]: rows[0:] for rows in list(csv.reader(f)) } 

Bunun yerine, ikinci dosyada dayanarak sözlüğü yapmalıdır:

with open("CSVFILE2.csv", "r") as f1: 
    code = { row[1]: row[2] for row in csv.reader(f1) } 

Ardından, ilk dosyanın üzerine döngü ve her satır için uygun kodu ekleyin. Birleştirilen verileri yeni dosyaya yazın ve yazın.


açıklama row + [code[row[1]]] arasında:

satır, daha sonra "AZ" olan

  • row[1],
  • code[row[1]]4 olan code["AZ"] olup,
  • [code[row[1]]]["FLAGSTAFF", "AZ", 50244.67, 5.02, "KA1_Podium_Garage_S"] ise listeolduğu 10
  • ve row + [code[row[1]] istenilen yeni bir satır değerinin oluşturulması, liste birleşimidir: ["FLAGSTAFF", "AZ", 50244.67, 5.02, "KA1_Podium_Garage_S", 4]
İlgili konular