csv.DictReader仅读取CSV文件第一行问题排查求助
问题分析与修复方案
嘿,我帮你找出问题所在了!你的代码里有两个关键细节没处理好,导致最后要么只能拿到最后一行数据,要么解析逻辑有隐患:
1. 变量赋值错误导致数据被覆盖
你把stockPxData定义成了一个空字典,然后在循环里写了stockPxData = row——这就意味着每遍历一行,你都会把之前存储的内容完全替换成当前行的字典。循环结束后,stockPxData自然只会保留最后一行的数据,而不是所有行的集合。
2. 定义了fieldnames但未传给DictReader
虽然这不一定直接导致“只返回第一行”的问题,但如果你的CSV文件表头和你定义的fieldnames不匹配,DictReader会解析出不符合预期的键(甚至可能把表头行当成数据行处理)。如果你的CSV文件第一行就是你指定的这些表头,要么显式把fieldnames传给DictReader,要么让它自动读取第一行作为表头,这样更稳妥。
修正后的代码示例(推荐版本)
如果你的CSV文件第一行已经是Time,Open,High,Low,Last,Change,Volume这些表头,可以直接用下面的代码,简洁又准确:
import csv with open('aapl_price-history-01-09-2019.csv') as csvfile: # 自动读取CSV第一行作为表头 stockPxReader = csv.DictReader(csvfile) # 直接把reader对象转换成列表,一次性存储所有行数据 stockPxData = list(stockPxReader) # 遍历打印每一行 for row in stockPxData: print(row) # 后续可以直接使用stockPxData操作所有数据
如果你需要强制使用自定义的fieldnames
如果CSV文件没有表头,或者你想忽略原表头用自己定义的字段名,就把fieldnames传给DictReader:
import csv with open('aapl_price-history-01-09-2019.csv') as csvfile: fieldnames = ['Time', 'Open', 'High', 'Low', 'Last', 'Change', 'Volume'] stockPxReader = csv.DictReader(csvfile, fieldnames=fieldnames) stockPxData = [] for row in stockPxReader: stockPxData.append(row) print(row)
这样修改后,stockPxData就会存储CSV里的所有行数据,而不是只保留最后一行啦!
内容的提问来源于stack exchange,提问作者Sean Low
相关产品推荐
相关产品推荐

