如何获取csv.reader的当前行号?跳过指定行数后处理数据遇问题
在csv.reader中获取当前行号的正确方法
嘿,我来帮你搞定这个问题!你之前的代码里犯了个小错误:你直接访问了csv.reader这个类的line_num属性,而不是你创建的reader实例的属性,这就是那行代码无效的原因。
核心问题解释
csv.reader是一个类,当你用csv.reader(csvfile, ...)创建出具体的reader实例后,这个实例才会跟踪当前读取的行号,存储在它的.line_num属性里。直接调用csv.reader.line_num相当于访问类的静态属性,根本不是当前读取器的行号,自然没用。
结合你的需求:跳过i行后处理j行
我给你两种常用的实现方式,对应不同的行号统计需求:
方式1:统计整个文件的真实行号(包括跳过的行)
这种方式下,我们先创建reader实例,用next(reader)跳过指定行数,reader会自动累计跳过的行,.line_num会显示当前行在整个文件中的真实编号:
import csv def csv_reader(df): skip_lines = 90 # 要跳过的行数i process_lines = 50 # 要处理的行数j,可自行修改 with open(df, 'r') as csvfile: # 创建reader实例,注意delimiter要匹配你的文件分隔符 reader = csv.reader(csvfile, delimiter=' ', skipinitialspace=True) # 跳过前skip_lines行,加入异常处理避免文件行数不足 for _ in range(skip_lines): next(reader, None) # 处理接下来的process_lines行 processed_count = 0 for line in reader: if processed_count >= process_lines: break # 这里的reader.line_num就是当前行在整个文件中的行号 print(f"文件行号: {reader.line_num}, 内容: {line}") processed_count += 1
方式2:只统计处理的行的序号(从1开始)
如果你不需要整个文件的行号,只关心跳过之后处理的是第N行,可以用enumerate辅助统计:
import csv def csv_reader(df): skip_lines = 90 process_lines = 50 with open(df, 'r') as csvfile: reader = csv.reader(csvfile, delimiter=' ', skipinitialspace=True) # 跳过指定行数 for _ in range(skip_lines): next(reader, None) # 处理行,同时统计处理的序号 for process_idx, line in enumerate(reader, start=1): if process_idx > process_lines: break print(f"处理第{process_idx}行, 文件行号: {reader.line_num}, 内容: {line}")
额外提醒
- 别直接用
next(csvfile)跳过行!这种方式只会移动文件指针,但reader不会统计这些跳过的行,导致.line_num和真实文件行号不符。 - 如果你的CSV是用逗号分隔的,记得把
delimiter=' '改成delimiter=',',要匹配实际文件格式。
内容的提问来源于stack exchange,提问作者flywire
相关产品推荐
相关产品推荐

