如何同时读取两个CSV文件并调用两个文件多列中的变量
你的代码存在以下几处错误:
- 缺少依赖模块导入,运行时会直接抛出未定义错误,需要先导入
csv和time模块 with语句下的代码块没有正确缩进,不符合Python语法规则- 变量调用逻辑错误:
csv.DictReader返回的每一行是字典格式,需要通过row[字段名]的方式取值,你直接调用username、title会报未定义错误 - 嵌套循环存在迭代器耗尽问题:
csv.DictReader是迭代器对象,第一次内层循环遍历完rdr2后,后续外层循环迭代时内层不会再返回任何内容
场景1:两个CSV行数相同,按行一一对应取值
如果需要test1的第N行对应test2的第N行取值,使用zip同时迭代两个读取器即可:
import csv import time with open("test1.csv","r",encoding="utf-8") as f, open("test2.csv","r",encoding="utf-8") as g: fieldnames = ['username', 'password'] fieldnames2 = ['title', 'afflink'] rdr1 = csv.DictReader(f, delimiter=',', fieldnames=fieldnames) rdr2 = csv.DictReader(g, delimiter=',', fieldnames=fieldnames2) for row1, row2 in zip(rdr1, rdr2): print(row1['username'], row2['title']) time.sleep(1)
场景2:test1的每一行匹配test2的所有行(笛卡尔积)
如果要实现你原有嵌套逻辑的效果,需要先把test2的所有数据缓存到列表中,避免迭代器单次遍历后耗尽:
import csv import time with open("test1.csv","r",encoding="utf-8") as f, open("test2.csv","r",encoding="utf-8") as g: fieldnames = ['username', 'password'] fieldnames2 = ['title', 'afflink'] rdr1 = csv.DictReader(f, delimiter=',', fieldnames=fieldnames) # 提前把test2的所有数据读取到列表缓存 rdr2_list = list(csv.DictReader(g, delimiter=',', fieldnames=fieldnames2)) for row1 in rdr1: for row2 in rdr2_list: print(row1['username'], row2['title']) time.sleep(1)
内容的提问来源于stack exchange,提问作者natalie22
相关产品推荐
相关产品推荐

