csv.reader报错:iterator should return strings, not list 技术求助
解决CSV读写时的迭代器类型错误问题
我来帮你拆解下问题根源,以及对应的修复方案:
错误原因分析
- 第一个报错的核心问题:你在主函数里已经用
csv.reader把文件解析成了「行列表的迭代器」,然后把这个迭代器传给了csv_reader函数。但csv_reader函数里又把它当成原始文件对象传给了另一个csv.reader——csv.reader期望输入的是每行是字符串的迭代器(比如打开的文本文件),而你给它的是每行已经被解析成列表的迭代器,自然就触发了iterator should return strings, not list的错误。 - 二进制模式的问题:Python3中
csv模块必须用文本模式(r)打开文件,二进制模式(rb)读取的是字节串,不符合csv.reader的要求,所以会出现iterator should return byte的错误。 - 额外小问题:Python里判断空值要用
None,不是NULL(这是SQL/其他语言的写法),直接写NULL会触发NameError。
修正后的完整代码
import csv def csv_reader(fileobj, output_path): # 直接基于传入的文本文件对象创建csv.reader reader = csv.reader(fileobj, delimiter=',') # 用newline=''避免跨平台换行符问题,这是csv模块官方推荐写法 with open(output_path, "w", newline='') as csv_file: writer = csv.writer(csv_file, delimiter=',') header_written = False for row in reader: # 处理表头:直接写入即可,无需手动拼接逗号 if not header_written: writer.writerow(row) header_written = True continue # 跳过Trade类型的行 if row[3] == "Trade": continue # 处理空值:同时判断None和空字符串(CSV里的空值常以空字符串存在) if row[6] is None or row[6].strip() == '': r = [row[0], row[0], "A", row[8], row[9], row[0]] else: r = [row[0], row[0], "B", row[6], row[7], row[0]] writer.writerow(r) if __name__ == "__main__": input_path = "FlowEdge-TRTH-Time_Sales.csv" output_path = "sales.csv" # 用with语句管理输入文件,自动关闭,避免资源泄漏 with open(input_path, "r", newline='') as f_obj: # 直接传递文本文件对象,而非提前解析的迭代器 csv_reader(f_obj, output_path)
关键修改点说明
- 修正参数传递逻辑:主函数不再提前解析文件,直接把文本模式打开的文件对象传给
csv_reader,让函数内部处理解析,符合csv模块的使用规范。 - 修复空值判断逻辑:替换
NULL为row[6] is None or row[6].strip() == '',覆盖CSV中空值的常见表现形式。 - 优化表头写入:删除
",".join(row),直接用writer.writerow(row)写入表头,避免把表头变成单一列。 - 统一用
with管理文件:所有文件操作都放在with块中,确保文件自动关闭,避免资源泄漏。 - 添加
newline=''参数:这是Python官方推荐的csv模块使用方式,能避免Windows/Linux下的换行符混乱问题。
内容的提问来源于stack exchange,提问作者abhihacker02
相关产品推荐
相关产品推荐

