Python中ADO GetRows读取SQL数值时小数分隔符为逗号的问题解决
解决ADODB读取SQL Server时数值列因区域设置变为字符串的问题
你的问题核心是瑞典语系统的区域设置(默认用逗号做小数分隔符)导致ADODB返回的数值被格式化为带逗号的字符串,而非原生数值类型。以下是几种可行的解决办法:
方法1:在连接字符串中指定区域ID(推荐)
直接在ADODB连接字符串里添加Locale Identifier=1033(1033对应英文-US区域,强制用点作为小数分隔符),从数据源层面避免格式转换问题。
修改后的连接代码:
adoConn.Open("Provider = SQLOLEDB; Data Source = {}; Integrated Security = SSPI; Locale Identifier=1033".format(datasource_))
这样ADODB会以英文区域格式返回数值,读取后直接是数值类型,无需额外转换。
方法2:读取后手动转换数值类型
如果无法修改连接字符串,可以在构建DataFrame时,根据ADODB返回的字段类型,将带逗号的字符串转换为数值:
修改函数的返回部分:
df = pd.DataFrame(data=data, columns=cols) # 定义ADODB数值类型对应的ID(常见数值类型) numeric_field_types = {3, 5, 13, 14} # adInteger=3, adDouble=5, adNumeric=13, adDecimal=14 for col_idx, col_name in enumerate(cols): if data_type[col_idx] in numeric_field_types: # 替换逗号为点后转换为数值 df[col_name] = pd.to_numeric(df[col_name].str.replace(',', '.'), errors='coerce') return {'data': df, 'data_type': data_type}
方法3:临时修改Python运行时区域设置
在代码开头添加区域设置代码,强制Python使用英文数值格式:
import locale # 切换到英文-US区域(需系统已安装该语言包) try: locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8') except locale.Error: print("系统未安装en_US区域包,无法使用此方法")
注意:该方法依赖系统已安装对应语言包,兼容性不如前两种。
内容的提问来源于stack exchange,提问作者k.dkhk
相关产品推荐
相关产品推荐

