Python中_csv.reader无split属性错误及TSV文件求和实现问询
解决TSV文件读取、首行打印及列求和问题
先帮你拆解下当前代码的问题:
- 你错误地遍历了原始文件对象
inputfile,而非csv.reader生成的dataArray;而且csv.reader已经帮你把每行按制表符拆成了列表,根本不需要再调用split方法——这就是你遇到AttributeError: '_csv.reader' object has no attribute 'split'的核心原因。 - 另外,你用
next(inputfile)直接跳过了首行,但你的需求是打印首行,这一步逻辑完全搞反了。
下面是修正后的完整代码,我会分两种场景给出方案,你可以根据自己的TSV结构选择:
场景1:按列索引求和(适合无明确表头的TSV)
假设你要对**第二列(Python索引为1)**的数值求和:
import csv # 确保你的filePath和fileName变量已经提前定义 full_path = filePath + fileName with open(full_path, 'rt') as inputfile: # 先读取并打印首行 header_line = next(inputfile) print(header_line.strip()) # strip()用来去掉行尾的换行符 # 初始化TSV读取器,指定制表符为分隔符 tsv_reader = csv.reader(inputfile, delimiter='\t') # 初始化求和变量 total = 0 # 遍历处理每一行数据 for row in tsv_reader: # 跳过空行,避免索引报错 if not row: continue try: # 把目标列的内容转为浮点数(如果是整数可以用int()) num = float(row[1]) total += num except ValueError: # 遇到非数值内容时跳过,并打印提示(可选) print(f"跳过非数值行:{row}") # 打印最终求和结果 print(f"目标列的总和:{total}")
场景2:按列名求和(适合带明确表头的TSV)
如果你的TSV首行是表头,用DictReader会更直观,不需要记列的索引:
import csv full_path = filePath + fileName with open(full_path, 'rt') as inputfile: # 用DictReader读取,每行数据会被转为字典,键就是表头名 tsv_reader = csv.DictReader(inputfile, delimiter='\t') # 打印表头(用制表符拼接还原TSV格式) print("\t".join(tsv_reader.fieldnames)) total = 0 # 替换成你要求和的列的真实表头名 target_column = "数值列" for row in tsv_reader: try: num = float(row[target_column]) total += num except (ValueError, KeyError): # 处理非数值或列名不存在的情况 print(f"跳过无效行:{row}") print(f"{target_column}的总和:{total}")
关键注意点:
- 如果要求和的是其他列,只需要修改场景1中的
row[1]索引,或者场景2中的target_column列名即可。 - 加入
try-except块是为了避免遇到非数值内容时程序崩溃,你可以根据实际需求决定是否保留这部分逻辑。
内容的提问来源于stack exchange,提问作者Philip
相关产品推荐
相关产品推荐

