如何在Python中基于共同列合并两个CSV文件并生成指定输出?
如何基于City字段合并两个CSV文件并生成输出?
看起来你想要基于City字段关联两个CSV文件,把用户信息和对应的州信息合并到一起输出。我们先梳理下现有代码里的几个问题,再给出正确的实现方案:
现有代码的问题
- 文件名不匹配:你描述的是
file1.csv和file2.csv,但代码里用的是allUsers1.csv和mahrashtra.csv,如果这是笔误,需要先修正文件名 - 索引错误:
file1.csv的字段顺序是Name(0)、EmailId(1)、City(2),所以要取城市应该用row1[2],而不是row1[5];另外你需要比较的是两个文件的City字段,也就是row1[2]和row2[0],而不是row2[1](row2[1]是State) - 嵌套循环逻辑缺陷:当你第一次遍历
reader2后,这个迭代器就已经耗尽了,后续的row1循环里reader2不会再有数据返回 - 未处理大小写差异:
file1里的城市是pune(小写),file2里是Pune(首字母大写),直接字符串比较会不匹配 - 没有生成目标输出:当前代码只打印了
row1,没有合并State字段并写入输出文件
正确的实现方案
我们可以先把file2.csv的城市-州映射存入字典,这样后续查找州信息的效率会很高,然后遍历file1.csv的每一行,匹配对应的州并生成合并后的行,写入输出文件:
import csv def merge_csv_files(): # 第一步:读取file2.csv,构建City到State的映射字典 city_state_map = {} with open(r'C:\Users\admin\Desktop\compare\file2.csv', 'r', newline='', encoding='utf-8') as f2: reader2 = csv.reader(f2, delimiter=',') # 跳过表头(如果你的CSV有表头的话,无表头可注释此行) next(reader2) for row in reader2: city = row[0].strip().lower() # 统一转小写,避免大小写匹配问题 state = row[1].strip() city_state_map[city] = state # 第二步:读取file1.csv,合并State并写入输出文件 output_file = r'C:\Users\admin\Desktop\compare\merged_output.csv' with open(r'C:\Users\admin\Desktop\compare\file1.csv', 'r', newline='', encoding='utf-8') as f1, \ open(output_file, 'w', newline='', encoding='utf-8') as out_f: reader1 = csv.reader(f1, delimiter=',') writer = csv.writer(out_f, delimiter=',') # 处理表头:如果file1有表头,添加State字段后写入 header = next(reader1) header.append('State') writer.writerow(header) # 处理每一行数据 for row in reader1: user_city = row[2].strip().lower() # 查找对应的州,找不到则用默认值'Unknown'(可按需修改) state = city_state_map.get(user_city, 'Unknown') # 合并行数据并写入 merged_row = row + [state] writer.writerow(merged_row) # 可选:打印结果到控制台 print(','.join(merged_row)) merge_csv_files()
额外说明
- 用
with open()的方式可以自动关闭文件,比直接open()更安全规范 - 添加
strip()处理多余空格,避免因空格导致的匹配失败 - 统一转小写比较城市名称,解决大小写不一致的问题
- 如果你的CSV文件没有表头,记得注释掉跳过表头的
next(reader)和表头处理代码
内容的提问来源于stack exchange,提问作者himani keskar
相关产品推荐
相关产品推荐

