Python使用lstrip清洗ODBC获取的MS SQL数据失效问题及实现方案
出错原因定位
- 核心逻辑误用:你使用了
lstrip()仅清除字符串左侧的空白,未处理尾部的空格、制表符等不可见字符。- 直接打印单个变量时,尾部的制表符/空格会被终端输出效果掩盖(比如末尾的
\t只会让光标右跳,不会显示可见字符),因此你会误以为变量已被清洗干净。 - 打印整个字典时,Python会输出字符串的
repr()表示,自动将不可见字符转义为\t、\n这类可见序列,因此你能看到原本隐藏的多余字符。
- 直接打印单个变量时,尾部的制表符/空格会被终端输出效果掩盖(比如末尾的
- 潜在隐患:手动用
range(len(items))遍历索引的写法和SELECT列顺序强耦合,一旦查询列和items列表顺序不匹配,会出现值和列名错位的问题;如果ODBC驱动返回非字符串类型(如bytes、None)直接调用字符串方法也会触发异常。
最优实现方案
基础适配版(仅清除首尾多余空白)
该版本直接对齐查询返回的实际列结构,无需手动维护列名列表,同时兼容非字符串类型的返回值:
# 执行查询,SELECT的列名直接对应返回值顺序 cursor.execute('SELECT your_col1, your_col2, your_col3, your_col4 FROM DEV.blabla') # 从游标元数据中自动提取列名,完全和返回值顺序对齐 col_names = [col_desc[0] for col_desc in cursor.description] # 初始化结果字典 list_attr_data = {col: [] for col in col_names} for row in cursor: # 按列名和值一一对应遍历,避免索引错位 for col_name, value in zip(col_names, row): # 仅对字符串类型做清洗,None/数值类型直接保留 cleaned_val = value.strip() if isinstance(value, str) else value list_attr_data[col_name].append(cleaned_val)
进阶清洗版(清除所有连续空白字符)
如果需要同时删除字符串中间的多个连续空格、制表符、换行符,用正则统一替换:
import re def clean_field(val): if not isinstance(val, str): return val # 先清除首尾空白,再把中间所有连续空白(含\t、\n、多个空格)替换为单个空格 return re.sub(r'\s+', ' ', val.strip()) # 遍历逻辑替换原有清洗步骤即可 for row in cursor: for col_name, value in zip(col_names, row): list_attr_data[col_name].append(clean_field(value))
额外适配:如果ODBC驱动返回bytes类型的字段,在清洗前先调用
decode()转成字符串即可:decoded_val = value.decode() if isinstance(value, bytes) else value cleaned_val = decoded_val.strip() if isinstance(decoded_val, str) else decoded_val
内容的提问来源于stack exchange,提问作者anastasiiia
相关产品推荐
相关产品推荐

