Python 从配置文件读取的字符串和直接程序里面设置的字符串有啥区别? odbc 无法识别配置文件的字符串

2018-01-16 20:55:03 +08:00
 qile1

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

2355 次点击
所在节点    Python
10 条回复
xiaoyaoking
2018-01-16 20:57:57 +08:00
编码正常吗?
likuku
2018-01-16 22:19:26 +08:00
windows 啊,系统默认 GBK 编码,文件保存若选 Unicode 默认是 UTF-16

路径,最好是读成 raw 数据 /bytes 类型,再 decode('utf-8') 成 str 来用,这样就好。
likuku
2018-01-16 22:20:14 +08:00
.py 都选择使用 UTF-8,嗯当然是 py3 环境。
qile1
2018-01-16 23:36:28 +08:00

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
likuku
2018-01-16 23:41:29 +08:00
建议生成文件路径使用 os.path,自己拼 str 总会有点问题
likuku
2018-01-16 23:46:16 +08:00
import os
db_filename=os.path.join("D:","pythontest","Data.mdb")

参考:
python os.path 模块常用方法详解-王伟-51CTO 博客 : http://blog.51cto.com/wangwei007/1104940
qile1
2018-01-17 01:30:37 +08:00
@likuku 非常感谢回复,这个文件地址是放到 ini 配置文件里面后期根据地址修改,还有很多配置参数也写里面了,数据路径读出来后
报这个错误 codecs.utf_16_le_encode(input, self.errors)[0]
python3.6 我在想,我读取配置文件后,转为 utf-16-le 是否可行,但一直没转成功
likuku
2018-01-17 04:29:46 +08:00
@qile1 你可以尝试编辑,保存 配置文件 .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")
likuku
2018-01-17 04:35:48 +08:00
@qile1 哦,#8 不对的,改这样:
conn = pyodbc.connect(DBfile.encode("utf-8"))

执行环境得是 UTF-8
mingl0280
2018-01-17 08:25:45 +08:00
db_filename="D:\\pythontest\\Data.mdb"
DBQ=D:\\pythontest\\xc\\dada.mdb

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/423447

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX