Python中从配置文件读取的字符串与直接程序内设置的字符串有什么区别?ODBC无法识别配置文件的字符串
如题,弄 odbc 读取 access 数据库,目录路径是设置到 ini 配置文件里面,使用 config 读取后,无法打开,提示注册表问题好像,但是把路径写死到函数里面就可以,读取的变量属性都是 str, 比如路径为 d:\ee\data.mdb
Python中从配置文件读取的字符串与直接程序内设置的字符串有什么区别?ODBC无法识别配置文件的字符串
编码正常吗?
这个问题很常见,核心区别在于编码和不可见字符。
从配置文件(比如.ini、.yaml、.json)读取的字符串,其编码取决于文件本身的编码(通常是UTF-8)和读取方式。如果配置文件是Windows记事本保存的,可能带有BOM头,或者包含换行符、制表符等不可见字符,这些都会被读入字符串。
而程序内直接写的字符串,编码是明确的(Python源码文件的编码),也不会有文件引入的额外字符。
ODBC连接字符串对格式非常敏感,多一个空格、换行或不可见字符都可能导致连接失败。最常见的问题是:
- 配置文件末尾的换行符:用
open().read()或readline()读取时,行尾的\n会被包含。 - 配置文件编码问题:文件以带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)
关键操作:
- 使用
repr()查看字符串的真实内容,会显示换行符\n、制表符\t等。 - 用
.strip()去除首尾空白字符,这通常能解决大部分问题。 - 读取配置文件时指定
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
我觉得只是你配置文件路径错……

