关于Python csv.DictReader()循环首次迭代执行逻辑的疑问
问题解析:CSV DictReader 循环逻辑困惑
首先明确csv.DictReader的核心行为:它会自动把CSV文件的第一行当作字段名(列名),后续每一行数据会被转换成字典,字典的键就是这些字段名,值对应每行的内容。所以遍历csv_reader时,你拿到的是两行数据(对应John和Erica的记录),而不是包含表头的三行。
接下来拆解代码的执行流程,你就能明白第一次循环的逻辑:
- 初始化
line_count = 0 - 第一次循环(row是John的记录字典):
- 满足
line_count == 0,进入if块:- 执行
print(f'Column names are {", ".join(row)}'):因为字典的键是字段名,所以这里打印的是表头(name, department, birthday month) line_count += 1→ 此时line_count变为1
- 执行
- 继续执行if块之后的代码:
- 执行
print(f'\t{row["name"]}...'):打印John的信息(也就是输出里表头下面的那一行) line_count += 1→ 此时line_count变为2
- 执行
- 满足
- 第二次循环(row是Erica的记录字典):
line_count是2,不满足line_count == 0,跳过if块- 执行print语句打印Erica的信息
line_count += 1→ 此时line_count变为3
- 循环结束,打印
Processed 3 lines.
你之所以误以为第一次循环里if块之后的代码没执行,是混淆了csv.DictReader的处理逻辑:你以为循环的第一次迭代是读取表头行,但实际上表头已经被作为字段名提取,循环迭代的是数据行,而", ".join(row)恰好取到了字典的键(表头),让你误以为这一次循环只处理了表头,但实际上它同时完成了表头打印和第一行数据的打印。
内容的提问来源于stack exchange,提问作者zsfzu0
相关产品推荐
相关产品推荐

