You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 03:54:24