Python中从配置文件读取的字符串与直接程序内设置的字符串有什么区别?ODBC无法识别配置文件的字符串

如题,弄 odbc 读取 access 数据库,目录路径是设置到 ini 配置文件里面,使用 config 读取后,无法打开,提示注册表问题好像,但是把路径写死到函数里面就可以,读取的变量属性都是 str, 比如路径为 d:\ee\data.mdb


Python中从配置文件读取的字符串与直接程序内设置的字符串有什么区别?ODBC无法识别配置文件的字符串
10 回复

编码正常吗?


这个问题很常见,核心区别在于编码不可见字符

从配置文件(比如.ini.yaml.json)读取的字符串,其编码取决于文件本身的编码(通常是UTF-8)和读取方式。如果配置文件是Windows记事本保存的,可能带有BOM头,或者包含换行符、制表符等不可见字符,这些都会被读入字符串。

而程序内直接写的字符串,编码是明确的(Python源码文件的编码),也不会有文件引入的额外字符。

ODBC连接字符串对格式非常敏感,多一个空格、换行或不可见字符都可能导致连接失败。最常见的问题是:

  1. 配置文件末尾的换行符:用open().read()readline()读取时,行尾的\n会被包含。
  2. 配置文件编码问题:文件以带BOM的UTF-8保存,BOM字符\ufeff会出现在字符串开头。

排查和解决代码:

import configparser
import re

# 假设你的配置文件 config.ini 内容为:
# [database]
# connection_string = Driver={SQL Server};Server=myServer;Database=myDB;

config = configparser.ConfigParser()
config.read('config.ini', encoding='utf-8-sig')  # 使用utf-8-sig自动去除BOM

raw_str = config['database']['connection_string']
print(f"原始字符串长度: {len(raw_str)}")
print(f"原始字符串repr: {repr(raw_str)}")

# 清理字符串:去除首尾空白字符(包括换行符)
clean_str = raw_str.strip()
print(f"清理后长度: {len(clean_str)}")
print(f"清理后repr: {repr(clean_str)}")

# 对比检查
program_str = "Driver={SQL Server};Server=myServer;Database=myDB;"
print(f"程序内字符串repr: {repr(program_str)}")
print(f"是否完全相等: {clean_str == program_str}")

# 使用清理后的字符串
# your_odbc_function(clean_str)

关键操作:

  1. 使用repr()查看字符串的真实内容,会显示换行符\n、制表符\t等。
  2. .strip()去除首尾空白字符,这通常能解决大部分问题。
  3. 读取配置文件时指定encoding='utf-8-sig',它能处理UTF-8 BOM。

一句话建议:用repr()打印对比,并用.strip()清理配置字符串。

windows 啊,系统默认 GBK 编码,文件保存若选 Unicode 默认是 UTF-16

路径,最好是读成 raw 数据 /bytes 类型,再 decode(‘utf-8’) 成 str 来用,这样就好。

.py 都选择使用 UTF-8,嗯当然是 py3 环境。


db_filename=config.get(“user”, “db_filename”)
改为这个就可以读取
db_filename="D:\pythontest\Data.mdb"
不改报错是:
Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=D:\pythontest\xc\dada.mdb;Uid=;Pwd=;
(‘HY000’, "[HY000] [Microsoft][ODBC Microsoft Access Driver]常见错误 无法打开注册表项“ Temporary (volatile) Ace
DSN for process 0x17e8 Thread 0x42d8 DBC 0x6e47f24

建议生成文件路径使用 os.path,自己拼 str 总会有点问题

import os
db_filename=os.path.join(“D:”,“pythontest”,“Data.mdb”)

参考:
python os.path 模块常用方法详解-王伟-51CTO 博客 : http://blog.51cto.com/wangwei007/1104940

你可以尝试编辑,保存 配置文件 .ini 使用 UTF-8 编码,与 .py 处理方式一致。

Python 3.6.4 (default, Dec 21 2017, 00:56:19)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type “help”, “copyright”, “credits” or “license” for more information.
>>> s=‘我是猫’
>>> s.encode(‘utf-8’)
b’\xe6\x88\x91\xe6\x98\xaf\xe7\x8c\xab’
>>> s.encode(‘utf-16’)
b’\xff\xfe\x11b/f+s’
>>> s.encode(‘utf-16-le’)
b’\x11b/f+s’
>>> b’\x11b/f+s’.decode(‘utf-16-le’)
'我是猫’


我之前遇到类似状况:
macOS 的 文件系统里保存一些路径含有空格汉字和各种奇怪字符,
终端(UTF-8)下读到 /代码里 /配置文件(UTF-8)都正确,但 python3 通过 bash call 命令行的工具去访问这些路径时,就找不到了。
好在 python3 的 subprocess 支持路径信息可以直接使用 bytes 类型(按指定编码的字节流),只要原始字串路径是正确的,那么按文件系统 /shell 环境的编码转换后的 bytes 就可以被正确识别+执行。

你可尝试:
1. 你 .py 是直接运行(双击 .py 就关联解析器运行),那么 UTF-8 就 OK 的
2. 你的 .py 一个 cmd/powershell 窗口里运行,那么建议先在 cmd/powershell 里执行 chcp 65001 来让终端编码使用 UTF-8

或许你的 ODBC 驱动里也支持使用 bytes 类型访问数据文件,那么就可以试试:
db_filename1=“D:\pythontest\Data.mdb”.encode(“utf-8”)

哦,#8 不对的,改这样:
conn = pyodbc.connect(DBfile.encode(“utf-8”))

执行环境得是 UTF-8

db_filename=“D:\pythontest\Data.mdb”
DBQ=D:\pythontest\xc\dada.mdb

我觉得只是你配置文件路径错……

回到顶部