V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
qile1
V2EX  ›  Python

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

  •  
  •   qile1 · 2018-01-16 20:55:03 +08:00 · 2454 次点击
    这是一个创建于 2506 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2018-01-16 23:29:11 +08:00

    谢谢楼上回复,代码是这样的

    
    import configparser#引入读配置文件及其他模块
    db_filename=config.get("user", "db_filename")
    db_filename1="D:\pythontest\Data.mdb"
        DBfile = r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + db_filename + ";Uid=;Pwd=;"#db_filename  # 数据库文件
    
        print(r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + db_filename + ";Uid=;Pwd=;")
        conn = pyodbc.connect(DBfile)
        #conn = pyodbc.connect("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=D:\pythontest\dada.mdb;Uid=;Pwd=;")
        cursor = conn.cursor()
        SQL = "SELECT * from TestData where 日期>2018-01-16"
        imagepathall = []
        imagepathall = cursor.execute(imagepathallSQL % (resultID)).fetchall()
        cursor.close()
        conn.close()
    
    10 条回复    2018-01-17 08:25:45 +08:00
    xiaoyaoking
        1
    xiaoyaoking  
       2018-01-16 20:57:57 +08:00 via Android
    编码正常吗?
    likuku
        2
    likuku  
       2018-01-16 22:19:26 +08:00
    windows 啊,系统默认 GBK 编码,文件保存若选 Unicode 默认是 UTF-16

    路径,最好是读成 raw 数据 /bytes 类型,再 decode('utf-8') 成 str 来用,这样就好。
    likuku
        3
    likuku  
       2018-01-16 22:20:14 +08:00
    .py 都选择使用 UTF-8,嗯当然是 py3 环境。
    qile1
        4
    qile1  
    OP
       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
        5
    likuku  
       2018-01-16 23:41:29 +08:00
    建议生成文件路径使用 os.path,自己拼 str 总会有点问题
    likuku
        6
    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
        7
    qile1  
    OP
       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
        8
    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
        9
    likuku  
       2018-01-17 04:35:48 +08:00
    @qile1 哦,#8 不对的,改这样:
    conn = pyodbc.connect(DBfile.encode("utf-8"))

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

    我觉得只是你配置文件路径错……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4887 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 09:57 · PVG 17:57 · LAX 01:57 · JFK 04:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.