2017-12-06 123 views
5

Mam csv plik1 który jest jakJak porównać dwa pliki CSV?

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 

Mam pliku csv 2, który jest podobny,

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

teraz muszę dołączyć trzecią wartość kolumny z CSV plik2 do CSV plik1 porównując drugą kolumnę

Przykładowo powinny wyglądać,

Kod AZ jest 4 Kod WA 53 gdziekolwiek AZ, Waszyngton ma w moim csv plik1, kod powinien dostać dołączone do kolumny

Moje wyjście powinno wyglądać,

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 

Oto Kod, który próbowałem,

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) 

Wyjście otrzymuję podobne,

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

od 'dict' może mieć tylko jedną wartość dla każdego klucza; jeśli spróbujesz dodać klawisz kilka razy z różnymi wartościami, zajmie to tylko ostatnią –

+0

Sugeruję zmianę logiki: twój drugi plik csv wydaje się mieć tylko jedną instancję każdego stanu. utwórz dict z tym csv, gdzie klucze: pary val są stanem: liczby następnie przechodzą przez pierwszy CSV i dołączają wartości w razie potrzeby. –

Odpowiedz

2

Ta linia tworzy słownik na podstawie skrótu stanu z pierwszego pliku. To wygląda źle, ponieważ słownik może mieć tylko jeden klucz tylko raz, a na przykład masz wiele wierszy z "AZ".

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

Zamiast tego, należy dokonać na podstawie słownika drugiego pliku:

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

Następnie pętli nad swoim pierwszym pliku i dołączyć odpowiedni kod dla każdego wiersza.

with open("/home/sumit/Desktop/CSV_FILE1.csv", "r") as f: 
    merged = [ row + [code[row[1]]] for row in csv.reader(f) ] 

I zapisz scalone dane do nowego pliku.


Objaśnienie row + [code[row[1]]]:

Jeżeli rząd jest ["FLAGSTAFF", "AZ", 50244.67, 5.02, "KA1_Podium_Garage_S"], następnie

  • row[1] jest "AZ",
  • code[row[1]] jest code["AZ"] który 4,
  • [code[row[1]]] lista [4]
  • i row + [code[row[1]] jest lista konkatenacji, dając pożądany nową wartość rzędu: ["FLAGSTAFF", "AZ", 50244.67, 5.02, "KA1_Podium_Garage_S", 4]