遍历CSV行时出现‘list’ object has no attribute ‘items’错误求助
解决CSV读取时的AttributeError: 'list' object has no attribute 'items'
这个问题很常见——你用了csv.reader来读取文件,但它返回的每一行是列表类型,而items()是字典专属的方法,所以才会触发这个错误。结合你的需求(生成filename:value的列表),给你两种靠谱的解决方案:
方案1:改用csv.DictReader(推荐,代码更直观)
csv.DictReader会自动把CSV的第一行作为表头,后续每一行都返回一个字典,键是表头名称,值是对应列的内容,这样就能直接用键来取值,不用记索引:
import csv # 用来存储最终的filename:value列表 filename_value_pairs = [] with open('faces.csv', 'r') as csvfile: # 初始化DictReader,自动识别表头 faces_reader = csv.DictReader(csvfile) for row in faces_reader: # 直接通过表头键获取对应值 filename = row['filename'] value = row['value'] filename_value_pairs.append(f"{filename}:{value}") # 打印结果验证 for pair in filename_value_pairs: print(pair)
运行这段代码后,你会得到预期的输出:
image163.jpeg:6541546.633
image206.jpeg:5873455.229
image206.jpeg:5793978.982
image207.jpeg:6978847.211
image265.jpeg:6443535.129
方案2:继续用csv.reader,通过索引取值
如果坚持用csv.reader,可以先读取表头行,找到filename和value对应的列索引,再遍历后续行通过索引取值:
import csv filename_value_pairs = [] with open('faces.csv', 'r') as csvfile: faces_reader = csv.reader(csvfile) # 读取第一行作为表头 headers = next(faces_reader) # 找到filename和value对应的索引(避免硬编码索引,更灵活) filename_index = headers.index('filename') value_index = headers.index('value') for row in faces_reader: filename = row[filename_index] value = row[value_index] filename_value_pairs.append(f"{filename}:{value}") # 输出结果 for pair in filename_value_pairs: print(pair)
两种方案的区别
csv.DictReader代码可读性更高,适合表头固定、需要清晰关联键值的场景;csv.reader性能略优(差异极小,大部分场景可忽略),适合处理超大CSV或需要手动控制列索引的场景。
内容的提问来源于stack exchange,提问作者Tom Bar-Gal
相关产品推荐
相关产品推荐

