2017-12-06 64 views
5

Tôi có một csv file1 mà là giống nhưCách so sánh hai tệp 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 

Tôi có một tập tin csv 2 đó là như thế nào,

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

Bây giờ tôi phải nối thêm giá trị cột thứ ba từ csv file2 để csv file1, bằng cách so sánh cột thứ hai

Ví dụ: trông giống như,

AZ code is 4 WA code is 53 bất cứ nơi nào AZ, WA là có trong file1 csv của tôi, mã nên được nối vào một cột

đầu ra của tôi sẽ giống như thế,

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 

Đây là mã mà tôi đã cố gắng,

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) 

Output đang nhận được như thế nào,

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

một 'dict' chỉ có thể có một giá trị cho mỗi phím; nếu bạn cố gắng thêm một khóa nhiều lần với các giá trị khác nhau, nó sẽ chỉ lấy một số mới nhất –

+0

Tôi đề nghị chuyển đổi logic của bạn: tệp csv thứ hai của bạn dường như chỉ có một cá thể của mỗi trạng thái. tạo một dict với csv đó, nơi các khóa: cặp val là trạng thái: các số sau đó lặp lại thông qua csv đầu tiên và nối thêm các giá trị nếu cần. –

Trả lời

2

Dòng này đang tạo từ điển, dựa trên từ viết tắt của tiểu bang, từ tệp đầu tiên của bạn. Điều này có vẻ sai, vì từ điển chỉ có thể có mỗi khóa một lần và bạn có nhiều hàng với "AZ" chẳng hạn.

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

Thay vào đó, bạn nên thực hiện từ điển của bạn dựa trên các tập tin thứ hai:

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

Sau đó, vòng lặp qua tập đầu tiên của bạn, và thêm mã phù hợp với mỗi hàng.

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

Và ghi dữ liệu đã hợp nhất vào tệp mới.


Giải thích về row + [code[row[1]]]:

Nếu hàng là ["FLAGSTAFF", "AZ", 50244.67, 5.02, "KA1_Podium_Garage_S"], sau đó

  • row[1]"AZ",
  • code[row[1]]code["AZ"] đó là 4,
  • [code[row[1]]] là danh sách [4]
  • row + [code[row[1]] là danh sách nối, sản xuất giá trị hàng mới mong muốn: ["FLAGSTAFF", "AZ", 50244.67, 5.02, "KA1_Podium_Garage_S", 4]