Python CSV列搜索取值脚本报错求助:ord()参数类型错误
问题解决:TypeError: ord() expected a character, but string of length 2 found
错误原因
你的代码用ord(pickup_column) - 65将列字母转为索引,但这个方法仅支持单字母列名(如A、C)。当遇到AC这种双字母列名时,ord()无法处理长度为2的字符串,直接触发TypeError。
修复方案
实现一个通用函数,将Excel风格的列名(包含单/多字母,如A、AC、ZZ)转换为对应的0-based索引,替换原来的索引计算逻辑。
修改后的完整代码
import os import csv import json def excel_col_to_index(col_name): """将Excel列名(如A、AC、ZZ)转换为0-based索引""" index = 0 for char in col_name.upper(): index = index * 26 + (ord(char) - ord('A') + 1) return index - 1 # 转为0-based索引 # 读取搜索值 with open('C:/asg/ftpfiles/!searcher/01parseall.json') as json_file: dataparse = json.load(json_file) PartNumber = dataparse['distributornumsku'] vendorPartNumber = dataparse['manufacturervendor'] search_values = [PartNumber, vendorPartNumber] # 配置路径和列 directory_path = 'C:/asg/ftpfiles/!!!!!allsearch' search_columns = ['A', 'C'] pickup_columns = ['A', 'C', 'E', 'U', 'T', 'AC'] # 遍历CSV文件 for filename in os.listdir(directory_path): if filename.endswith('.csv'): with open(os.path.join(directory_path, filename), encoding="utf8", newline='') as csvfile: csvreader = csv.reader(csvfile) headers = next(csvreader) for row in csvreader: # 检查搜索列是否匹配 for search_col in search_columns: col_idx = excel_col_to_index(search_col) # 确保索引不超出当前行的列数,避免索引越界 if col_idx < len(row) and row[col_idx] in search_values: # 提取目标列的值 pickup_values = [] for pickup_col in pickup_columns: pickup_idx = excel_col_to_index(pickup_col) if pickup_idx < len(row): pickup_values.append(row[pickup_idx]) else: pickup_values.append(None) # 列不存在时填充None print(pickup_values) break # 找到匹配后停止当前行的搜索
关键修改点
- 新增
excel_col_to_index函数:- 支持所有Excel风格的列名(单字母、多字母)
- 通过26进制转换逻辑计算索引,最后转为0-based索引(适配Python列表的索引规则)
- 替换索引计算逻辑:
- 搜索列和提取列的索引都通过这个函数获取,不再使用
ord()
- 搜索列和提取列的索引都通过这个函数获取,不再使用
- 增加索引越界检查:
- 避免因CSV文件列数不足导致的
IndexError,列不存在时返回None
- 避免因CSV文件列数不足导致的
额外说明
- 函数会自动将列名转为大写,输入小写(如
ac)也能正常处理 - 索引越界的处理逻辑可根据需求调整,比如改为抛出异常或跳过该列
内容的提问来源于stack exchange,提问作者Alex Co
相关产品推荐
相关产品推荐

