Python如何同时遍历两个长度不同的CSV文件并分别提取列数据
解决方案
原方案使用zip()遍历的核心问题是:zip() 仅会遍历到两个可迭代对象中长度更短的那个耗尽为止,行数不一致时,更长的文件中超出短文件行数的部分会被完全丢弃,无法被读取。
针对两种常见需求场景,分别给出可行实现:
场景1:不需要行对齐,仅分别提取两个文件的全部指定列
如果你的需求只是把f1的第二列全量存入list_A、f2的第一列全量存入list_B,不需要将两个文件的行按位置配对,直接分开遍历两个CSV文件即可,逻辑最简单也最高效:
import csv list_A = [] list_B = [] with open(file_1,'r') as f1, open(file_2,'r') as f2: csvFile_1 = csv.reader(f1, delimiter=',') csvFile_2 = csv.reader(f2, delimiter=',') # 单独遍历f1提取指定列,增加行长度判断避免索引越界 for row in csvFile_1: if len(row) >= 2: list_A.append(row[1]) # 单独遍历f2提取指定列 for row in csvFile_2: if len(row) >= 1: list_B.append(row[0])
场景2:需要行对齐,即第n行的f1数据和f2数据按位置对应
如果需要按行位置配对两个文件的内容,哪怕其中一个文件没有对应行也要留占位,使用itertools.zip_longest替代zip(),它会遍历到最长的文件耗尽为止,缺失的行可以自定义填充值:
import csv from itertools import zip_longest list_A = [] list_B = [] # 自定义缺失行的填充值,可根据需求调整为空字符串、None等 FILL_VALUE = [] with open(file_1,'r') as f1, open(file_2,'r') as f2: csvFile_1 = csv.reader(f1, delimiter=',') csvFile_2 = csv.reader(f2, delimiter=',') for x, y in zip_longest(csvFile_1, csvFile_2, fillvalue=FILL_VALUE): # 提取f1的第二列,行存在且列足够才追加,也可以自行补充默认值逻辑 if len(x) >= 2: list_A.append(x[1]) # 提取f2的第一列 if len(y) >= 1: list_B.append(y[0])
说明:zip_longest 的fillvalue参数用于指定较短的文件耗尽后,缺失行的填充值,这里用空列表可以统一后续的长度判断逻辑,避免None调用len()时报错。
内容的提问来源于stack exchange,提问作者blupacetek
相关产品推荐
相关产品推荐

