如何用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
错误原因
- 重复打开文件导致逻辑混乱:先后两次打开同一个文件,且
with块内未使用自身打开的文件句柄,复用外部句柄容易引发读取异常; - 手动分割CSV未处理特殊情况:直接用
split(",")拆分行内容,未考虑文件编码(如UTF-8 BOM导致表头带隐藏字符)、换行符、空行等问题,可能导致表头元素与预期不符; - 变量名覆盖模块:
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
相关产品推荐
相关产品推荐

