Python使用csv.DictReader读取CSV时如何指定第n行作为表头
解决方案
csv.DictReader本身没有内置指定表头起始行的参数,你可以通过先跳过前序无效行的方式实现需求,操作非常简单,而且不会额外占用内存。
固定表头行号的场景
如果你明确知道表头在第n行(行号从1开始计数),先手动跳过前n-1行再初始化DictReader即可:
import csv # 假设表头在第5行,按需修改这个值 header_row_num = 5 with open(filename, 'r') as f: # 跳过前header_row_num-1行无效内容 for _ in range(header_row_num - 1): next(f) # 此时文件读取指针刚好指向表头行,直接传入DictReader即可 reader = csv.DictReader(f) for row in reader: # row就是以表头行内容为key的字典 print(row)
表头位置不固定的场景
如果你不知道表头具体在第几行,只有表头的特征规则(比如必须包含指定字段),可以逐行匹配到表头后再初始化DictReader:
import csv with open(filename, 'r') as f: fieldnames = None for line in f: # 自定义表头判断逻辑,这里以表头必须包含id、name两个字段为例 cols = line.strip().split(',') if {'id', 'name'}.issubset(set(cols)): fieldnames = cols break # 直接把匹配到的表头传给fieldnames参数,后续行自动按这个表头生成字典 reader = csv.DictReader(f, fieldnames=fieldnames) for row in reader: print(row)
- 两种方案都不会全量加载文件,即使是GB级的大CSV也能正常运行
- 如果CSV的分隔符不是逗号,可以给DictReader加上
delimiter参数指定,比如delimiter='\t'对应制表符分隔的文件 - 如果CSV格式复杂(存在字段内容含逗号、带引号等情况),表头判断阶段可以用csv.reader来解析每一行,避免手动split出错
内容的提问来源于stack exchange,提问作者ysd
相关产品推荐
相关产品推荐

