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

如何用Python将CSV文件转为列表字典?ValueError报错求解

问题解决:ValueError: 'OsmID' is not in list

问题详情

你希望将CSV数据转换为以OsmID为键的字典,你的CSV内容如下:

OsmID,NewName,IdLocal

1020287758,NN1,Id0001

1021229973,NN2,Id0002

1025409497,NN3,Id0003

使用以下代码时出现错误:

import csv

input = r'C:\Users\_M92\csvFiles\csv0001.csv'

fileRead = open(input, 'r')

with open(input, 'r') as csv:
    headerLine = fileRead.readline()
    header = headerLine.split(",")  
    #print(header)
    nameIndex = header.index("OsmID")    
    output = {}
    for line in fileRead.readlines():
        values = line.split(",")
        output[values[nameIndex]] = values

print(output)

错误信息:

File "c:\Users\_M92\Scripts\CsvToDict.py", 
    
    line 19, in <module>
        nameIndex = header.index("OsmID")

  ValueError: 'OsmID' is not in list

错误原因

  1. 重复打开文件导致逻辑混乱:先后两次打开同一个文件,且with块内未使用自身打开的文件句柄,复用外部句柄容易引发读取异常;
  2. 手动分割CSV未处理特殊情况:直接用split(",")拆分行内容,未考虑文件编码(如UTF-8 BOM导致表头带隐藏字符)、换行符、空行等问题,可能导致表头元素与预期不符;
  3. 变量名覆盖模块:with open(...) as csv:将csv变量名覆盖了导入的csv模块,属于不良编码习惯。

解决方案

推荐使用Python内置的csv模块处理CSV文件,它能自动处理编码、换行、空行等边缘情况,代码更健壮:

优化代码

import csv

input_path = r'C:\Users\_M92\csvFiles\csv0001.csv'
output = {}

# 使用utf-8-sig编码处理带BOM的UTF-8文件
with open(input_path, 'r', encoding='utf-8-sig') as file:
    # DictReader自动将每行转为字典,键对应表头
    reader = csv.DictReader(file)
    for row in reader:
        # 跳过空行(OsmID为空的行)
        if not row['OsmID']:
            continue
        output[row['OsmID']] = row

print(output)

手动处理的修复方案(不推荐)

如果坚持手动分割,需处理编码、换行符和空行:

input_path = r'C:\Users\_M92\csvFiles\csv0001.csv'
output = {}

with open(input_path, 'r', encoding='utf-8-sig') as fileRead:
    # 读取表头并去除首尾空白(包括换行符)
    headerLine = fileRead.readline().strip()
    header = headerLine.split(",")
    nameIndex = header.index("OsmID")
    
    for line in fileRead.readlines():
        # 去除行首尾空白,跳过空行
        line = line.strip()
        if not line:
            continue
        values = line.split(",")
        output[values[nameIndex]] = values

print(output)

说明

  • csv.DictReader是处理CSV的首选方式,能自动处理带引号的字段、不同分隔符等复杂情况;
  • encoding='utf-8-sig'用于解决UTF-8 BOM导致的表头隐藏字符问题,这是引发'OsmID' not in list的常见原因。

内容的提问来源于stack exchange,提问作者Timeless

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:06:28