基于ID匹配CSV文件并追加指定列的Python实现疑问
解决方案:CSV匹配并追加列
输入文件示例
File1 (whitelist.csv)
geographicSiteId,geographicAddressId,streetCode,streetName,streetNr,streetNrSuffix,floor,door,locality,postcode,city,zone,connectionPrice,fiberStatus 7999999,0a3f50b5-d364-32b8-e044-0003ba298018,940,Pedersmindevej,12,,,,Stensby,5485,Skamby,HOUSING,0,ADDRESS_CONNECTED
File2 (adresse.csv)
id,status,oprettet,ændret,vejkode,vejnavn,adresseringsvejnavn,husnr,etage,dør,supplerendebynavn,postnr,postnrnavn,stormodtagerpostnr,stormodtagerpostnrnavn,kommunekode,kommunenavn,ejerlavkode,ejerlavnavn,matrikelnr,esrejendomsnr,etrs89koordinat_øst,etrs89koordinat_nord,wgs84koordinat_bredde,wgs84koordinat_længde,nøjagtighed,kilde,tekniskstandard,tekstretning,ddkn_m100,ddkn_km1,ddkn_km10,adressepunktændringsdato,adgangsadresseid,adgangsadresse_status,adgangsadresse_oprettet,adgangsadresse_ændret,regionskode,regionsnavn,jordstykke_ejerlavnavn,kvhx,sognekode,sognenavn,politikredskode,politikredsnavn,retskredskode,retskredsnavn,opstillingskredskode,opstillingskredsnavn,zone,jordstykke_ejerlavkode,jordstykke_matrikelnr,jordstykke_esrejendomsnr,kvh,højde,adgangspunktid,vejpunkt_id,vejpunkt_kilde,vejpunkt_nøjagtighed,vejpunkt_tekniskstandard,vejpunkt_x,vejpunkt_y,afstemningsområdenummer,afstemningsområdenavn,brofast,supplerendebynavn_dagi_id,navngivenvej_id,menighedsrådsafstemningsområdenummer,menighedsrådsafstemningsområdenavn,vejpunkt_ændret,ikrafttrædelse,nedlagt,adgangsadresse_ikrafttrædelse,adgangsadresse_nedlagt,adgangsadresse_darstatus,darstatus,storkredsnummer,storkredsnavn,valglandsdelsbogstav,valglandsdelsnavn,landsdelsnuts3,landsdelsnavn,betegnelse 4decd9dc-1f1a-4ac2-ad29-5ce2877bc7e6,1,2019-08-29T14:21:50.823,2019-08-29T14:21:50.823,0306,Haulundvej,Haulundvej,93,,,,6760,Ribe,,,0561,Esbjerg,2007657,"Søndermarken, Ribe Jorder",251f,315673,484889.00977801974,6130238.110476224,55.31829849,8.76188569,A,5,TN,212.83,100m_61302_4848,1km_6130_484,10km_613_48,2023-02-10T11:42:25.912,2cf392a6-8649-4d48-bc8f-652a405da0d4,1,2019-08-29T14:21:50.823,2023-02-10T11:42:25.912,1083,Region Syddanmark,"Søndermarken, Ribe Jorder",05610306__93_______,8886,Ribe Domsogn,1464,Syd- og Sønderjyllands Politi,1151,Retten i Esbjerg,0053,Esbjerg Omegn,Landzone,2007657,251f,315673,05610306__93,2.7,662ea6da-9162-4876-a590-7ba2793c3747,fae767fe-e871-4c15-9fed-6049d7efa4dc,Adressemyn,A,V0,8.76197107,55.31854109,28,Ribe,1,,ae74a1c7-ce69-4ffe-af95-71dcb12eac18,1,Ribe Domsogn,2019-08-29T14:22:28.339685,2019-08-29T14:21:50.823,,2019-08-29T14:21:50.823,,3,3,7,Sydjylland,B,Sjælland-Syddanmark,DK032,Sydjylland,"Haulundvej 93, 6760 Ribe"
需求说明
提取File1第2列的geographicAddressId,在File2中匹配id列;若匹配成功,将File2的第23、24列(wgs84koordinat_bredde、wgs84koordinat_længde)追加到新文件,新文件需与File1结构一致,仅新增上述两列。
现有代码
#! /usr/bin/env python3 import csv file1 = 'whitelist.csv' file2 = 'adresse.csv' with open(file1, "r") as a, open(file2, "r") as b: csv_f1 = csv.reader(a) csv_f2 = csv.reader(b) for row in csv_f1: instnr = row[0] darid = row[1] print (instnr, darid) a.close() b.close()
问题困惑
不知道如何继续完成后续匹配及列追加的逻辑,寻求解决方案。
完整实现代码
核心思路是先将File2的ID与对应坐标存入字典(提升匹配效率),再遍历File1完成匹配与列追加:
#! /usr/bin/env python3 import csv file1 = 'whitelist.csv' file2 = 'adresse.csv' output_file = 'output.csv' # 1. 预加载File2的ID与坐标到字典 coordinate_map = {} with open(file2, "r") as b: csv_f2 = csv.reader(b) next(csv_f2) # 跳过表头 for row in csv_f2: addr_id = row[0] # CSV索引从0开始,第23、24列对应索引22、23 lat = row[22] lon = row[23] coordinate_map[addr_id] = (lat, lon) # 2. 处理File1并生成输出文件 with open(file1, "r") as a, open(output_file, "w", newline='') as out: csv_f1 = csv.reader(a) csv_writer = csv.writer(out) # 处理表头:追加新列标题 headers = next(csv_f1) headers.extend(['wgs84koordinat_bredde', 'wgs84koordinat_længde']) csv_writer.writerow(headers) # 处理每一行数据 for row in csv_f1: darid = row[1] if darid in coordinate_map: row.extend(coordinate_map[darid]) else: # 未匹配到则填充空值,可根据需求修改 row.extend(['', '']) csv_writer.writerow(row)
代码说明
- 字典存储优化:一次性读取File2数据存入字典,后续匹配时时间复杂度为O(1),避免重复遍历File2,提升大文件处理效率。
- 索引对应:注意CSV行的索引从0开始,需求中的第23、24列对应代码中的
row[22]和row[23]。 - 空值处理:未匹配到的行填充空值,可根据实际需求替换为其他默认标识。
内容的提问来源于stack exchange,提问作者user1348067
相关产品推荐
相关产品推荐

