You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用异常处理解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:36:08