如何针对CSV部分行重复执行指定操作?切片异常问题咨询
CSV处理的Python问题解答
需求回顾
要实现的功能:读取CSV文件,处理第7行之后的所有行,当第8列(索引7)不为空时,打印对应的rs_id(第5列,索引4)、p_dot(第2列,索引1)以及该列的表头。现有代码如下:
import csv with open("CYP2C9.csv",'r') as infile: reader = csv.reader(infile, delimiter=",") header= next(reader) for row in reader: rs_id = row[4] snp = row[7] p_dot = row[1] if snp != (""): print(rs_id, p_dot, header[7])
问题1:如何针对某一部分行重复执行操作?
可以通过行号计数器或文件指针重置实现,分两种场景处理:
场景1:处理指定范围的行(比如原文件第7-30行)
利用enumerate获取reader中的行索引(注意:next(reader)已跳过表头,reader的第0行对应原文件第2行),判断行索引在目标范围内再执行逻辑:
import csv with open("CYP2C9.csv",'r') as infile: reader = csv.reader(infile, delimiter=",") header = next(reader) # 原文件第7行对应reader的索引6,原文件第30行对应reader的索引29 target_start_idx = 6 target_end_idx = 29 for idx, row in enumerate(reader): if target_start_idx <= idx <= target_end_idx: rs_id = row[4] snp = row[7] p_dot = row[1] if snp != "": print(rs_id, p_dot, header[7])
场景2:重复处理某段行(比如把第7-30行的逻辑执行2次)
通过重置文件指针回到开头,跳过表头后重新遍历目标行,同时加次数限制避免死循环:
import csv with open("CYP2C9.csv",'r') as infile: reader = csv.reader(infile, delimiter=",") header = next(reader) target_start_idx = 6 target_end_idx = 29 repeat_times = 2 # 重复执行的次数 current_repeat = 0 while current_repeat < repeat_times: for idx, row in enumerate(reader): if target_start_idx <= idx <= target_end_idx: rs_id = row[4] snp = row[7] p_dot = row[1] if snp != "": print(rs_id, p_dot, header[7]) # 到达目标行末尾时,退出当前循环 if idx == target_end_idx: break current_repeat +=1 # 重置文件指针和reader infile.seek(0) next(reader) # 再次跳过表头 reader = csv.reader(infile, delimiter=",")
问题2:切片row[7:8]与单个索引row[7]输出不一致的解决方法
原因
row[7]是取列表中的单个元素(字符串类型),而row[7:8]是切片操作,返回的是包含该元素的子列表(比如['xxx']),打印时列表会显示方括号格式,所以输出不同。
解决方式
根据需求选择以下一种即可:
- 直接用单个索引(推荐,符合原始需求):
snp = row[7] print(header[7]) # 输出单个表头字符串
- 若需取连续多列,拼接成字符串:
如果要取第7到第9列(索引7-9),用join把列表转成可读字符串:
snps = row[7:10] print(', '.join(snps)) # 输出类似 "snp1, snp2, snp3" print(', '.join(header[7:10])) # 输出对应的表头
- 从切片中取单个元素:
如果不小心用了切片,直接取子列表的第一个元素:
snp = row[7:8][0] print(header[7:8][0])
内容的提问来源于stack exchange,提问作者Linnex Mal
相关产品推荐
相关产品推荐

