如何不使用异常处理解决Python读取CSV时的ValueError dtype报错
问题原因
你用Python标准库的csv.reader读取CSV文件时,会把文件的表头行(第一行)也作为普通数据读取到rows列表中。表头第三列的内容是字符串age,自然无法转换为整数,所以触发ValueError。
你提到用其他方式确认age字段类型为int64,是因为这类工具(比如pandas)读取CSV时会自动跳过表头、自动识别字段类型完成转换,但csv.reader不会做这层处理,读出来的所有单元格内容默认都是字符串类型,需要自行转换。
你添加异常处理后,程序遇到表头行的转换错误时会直接跳过该次循环,不会中断程序,后续的正常数据行就能正常执行,所以看起来可以正常运行。但这种方案属于用异常处理掩盖了逻辑漏洞,表头行的薪资数据也没有被正确处理(保持了原字符串salary未修改)。
无需异常处理的解决方案
方案1:手动跳过表头行
读取完所有行后,直接从索引1开始遍历,跳过第一行表头即可:
import csv infile = open('employee.csv') csvreader = csv.reader(infile) rows = [] for row in csvreader: rows.append(row) # 从第2行(索引1)开始遍历,跳过表头 for i in rows[1:]: if(int(i[2]) < 40): i[3] = round((1.05 * float(i[3])) , 2) else: i[3] = round((1.10 * float(i[3])) , 2) print('\n\n更新后列表:') for row in rows: print(row) with open('employeeUpdate.csv', 'w', encoding='UTF8', newline='') as f: writer = csv.writer(f) for row in rows: writer.writerow(row)
方案2:使用csv.DictReader读取(更易维护)
直接用DictReader自动识别表头,后续按字段名取值,逻辑更清晰不容易出错:
import csv with open('employee.csv', 'r', encoding='UTF8') as f: csvreader = csv.DictReader(f) # 直接获取表头 headers = csvreader.fieldnames rows = list(csvreader) for row in rows: age = int(row['age']) salary = float(row['salary']) if age < 40: row['salary'] = round(1.05 * salary, 2) else: row['salary'] = round(1.10 * salary, 2) print('\n\n更新后列表:') print(headers) for row in rows: print([row[h] for h in headers]) with open('employeeUpdate.csv', 'w', encoding='UTF8', newline='') as f: writer = csv.DictWriter(f, fieldnames=headers) writer.writeheader() writer.writerows(rows)
内容的提问来源于stack exchange,提问作者RoboC
相关产品推荐
相关产品推荐

