例如,第一個檔案包含用冒號分隔的名稱和日期:
john:01.01.2001
mary:06.03.2016
然后第二個檔案包含名稱和城市:
john:london
mary:new york
我需要按名稱將它們頂部合并到 csv 檔案中,如下所示:
name,town,date
john,london,01.01.2001
mary,new york,06.03.2016
此外,如果缺少有關人員的資訊,則在輸出檔案中應為“-”:
name,town,date
john,-,01.01.2001
mary,new york,-
uj5u.com熱心網友回復:
一個粗略的草稿。以后有機會我會清理一些。
cat name_date.csv
john:01.01.2001
mary:06.03.2016
sue:
cat name_city.csv
john:london
mary:new york
bob:
import csv
with open("name_date.csv") as dt_csv:
new_dict = {}
dt_dictR = csv.DictReader(dt_csv, fieldnames=["name", "date"], delimiter=':')
for row in dt_dictR:
if not row["date"]:
row["date"] = '-'
new_dict.update({row["name"]: {"date": row["date"]}})
with open("name_city.csv") as city_csv:
dt_dictC = csv.DictReader(city_csv, fieldnames=["name", "city"], delimiter=':')
print(new_dict)
for row in dt_dictC:
if not row["city"]:
row["city"] = '-'
if new_dict.get(row["name"]):
new_dict[row["name"]].update({"city": row["city"]})
else:
new_dict.update({row["name"]: {"date": '-', "city": row["city"]}})
with open("merged_csv", "w", newline='') as out_file:
csv_w = csv.writer(out_file)
csv_w.writerow(["name","town","date"])
for item in new_dict:
if not new_dict[item].get("city"):
new_dict[item]["city"] = '-'
csv_w.writerow([item, new_dict[item]["city"], new_dict[item]["date"]])
cat merged_csv
name,town,date
john,london,01.01.2001
mary,new york,06.03.2016
sue,-,-
bob,-,-
使用defaultdict稍微簡化一下:
import csv
from collections import defaultdict
with open("name_date.csv") as dt_csv:
def cityDateDict():
return {"city": "-", "date": "-"}
new_dict = defaultdict(cityDateDict)
dt_dictR = csv.DictReader(dt_csv, fieldnames=["name", "date"], delimiter=':')
for row in dt_dictR:
new_dict[row["name"]]
if row["date"].strip():
new_dict[row["name"]]["date"] = row["date"]
with open("name_city.csv") as city_csv:
dt_dictC = csv.DictReader(city_csv, fieldnames=["name", "city"], delimiter=':')
for row in dt_dictC:
new_dict[row["name"]]
if row["city"].strip():
new_dict[row["name"]]["city"] = row["city"]
with open("merged_csv", "w", newline='') as out_file:
csv_w = csv.writer(out_file)
csv_w.writerow(["name","town","date"])
for item in new_dict:
csv_w.writerow([item, new_dict[item]["city"], new_dict[item]["date"]])
defaultdict允許您使用“默認”值動態構建字典。在這種情況下,城市/日期dict默認為-. 然后可以使用非空值更新相應的鍵(城市/日期)以覆寫默認值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/514424.html
