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

Python中如何基于匹配值将一个CSV的数据合并至另一个?

解决CSV数据合并补充的问题

你的核心思路(通过匹配字段关联数据)是对的,但当前代码在文件读取逻辑和数据写入上有几个需要调整的地方,尤其是处理大量数据时,直接嵌套循环反复读文件效率很低,还容易出现指针位置错误的问题。我来帮你梳理下优化的方案:

当前代码的问题点

  • 文件指针重置错误:当你在内层循环遍历完reader2后,additional_info的文件指针已经走到了文件末尾,后续的外层循环再遍历reader2时根本读不到数据。你用的append.seek(0)(而且变量名append未定义)和original.seek(count)都是错误用法,csv.DictReader是按行迭代的,不需要手动调整指针位置。
  • 缺乏写入逻辑:你只打印了匹配项,但没有把合并后的数据写入新的CSV文件。
  • 效率低下:嵌套循环遍历两个CSV,数据量大的时候会非常慢,时间复杂度是O(m*n)。

优化实现方案

更高效的做法是先把补充数据加载到一个字典中,以匹配字段(也就是Name)作为键,这样后续查找匹配项只需要O(1)的时间。然后遍历原始CSV的每一行,根据District Name去字典里找对应的补充信息,把字段追加进去,最后写入新文件。

完整代码示例

import csv
import codecs

# 1. 先加载补充数据到字典,以Name为键,存储对应的补充字段
additional_data = {}
with codecs.open("new_information.csv", 'r', encoding='utf-8', errors='ignore') as additional_info:
    # 若你的new_information.csv没有表头,可手动指定fieldnames参数,比如fieldnames=['Name', 'District', 'Type', 'Description']
    reader2 = csv.DictReader(additional_info)
    for row in reader2:
        # 用Name作为键,把整行的补充信息存起来
        additional_data[row['Name']] = row

# 2. 遍历原始CSV,合并数据并写入新文件
output_filename = "merged_Texas_School_Districts.csv"
with codecs.open("Texas School Districts.csv", 'r', encoding='utf-8', errors='ignore') as original_csv, \
     codecs.open(output_filename, 'w', encoding='utf-8', errors='ignore') as output_csv:
    
    # 读取原始CSV的表头和数据
    reader1 = csv.DictReader(original_csv)
    # 构造新的表头:原始表头 + 补充数据的表头(去重,避免重复字段)
    merged_fieldnames = reader1.fieldnames + [field for field in reader2.fieldnames if field not in reader1.fieldnames]
    writer = csv.DictWriter(output_csv, fieldnames=merged_fieldnames)
    writer.writeheader()
    
    for row1 in reader1:
        # 查找匹配的补充数据
        district_name = row1['District Name']
        if district_name in additional_data:
            # 把补充数据合并到当前行
            row1.update(additional_data[district_name])
        # 即使没有匹配到,也写入原始数据(补充字段留空)
        writer.writerow(row1)

print(f"合并完成,结果已保存到 {output_filename}")

代码说明

  • 数据预加载:先把new_information.csv的所有数据读到字典里,后续不用反复打开读取文件,大幅提升效率。
  • 表头处理:自动合并两个CSV的表头,避免重复字段,保证输出的CSV结构完整。
  • 合并逻辑:用row1.update()把匹配到的补充字段直接追加到原始行,操作简单高效。
  • 容错处理:如果原始行找不到对应的补充数据,会保留原始数据,补充字段自动留空,不会丢失任何数据。

注意事项

  • 确保两个CSV中的匹配字段(District Name和Name)的文本完全一致,比如大小写、空格、特殊字符都要匹配,如果有不一致的情况,可以先做清洗(比如转小写、去除首尾空格)。
  • 如果你的CSV没有表头,需要手动指定fieldnames参数,调整代码里的DictReader部分即可。

内容的提问来源于stack exchange,提问作者Christian Gentry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:07:36