【问题标题】:Pandas read_sql_query with SQL file encoded in UTF-8带有以 UTF-8 编码的 SQL 文件的 Pandas read_sql_query
【发布时间】:2021-08-26 17:14:32
【问题描述】:

我正在尝试运行保存在以 UTF-8 编码的 SQL 文件中的查询。我的代码如下:

import pyodbc
import pandas as pd

query = open('test.sql', 'r')

print(query.read())

server = 'server' 
database = 'database' 
username = 'username' 
password = 'password' 

cnxn = pyodbc.connect(
    'DRIVER={ODBC Driver 17 for SQL Server};' +
    'SERVER=' + server + ';DATABASE=' + database +
    ';UID=' + username + ';PWD='+ password
)

df = pd.read_sql_query(query.read(), cnxn)
query.close()

print(df.head())

print(query.read()) 工作正常并正确显示test.sql 的内容,但read_sql_query 给出以下错误:

pyodbc.Error: ('HY090', '[HY090] [Microsoft][ODBC Driver Manager] 无效的字符串或缓冲区长度 (0) (SQLExecDirectW)')

如果我在运行之前在 Notepad++ 中将 SQL 文件的编码从 UTF-8 更改为 ANSI,则代码可以正常工作,没有错误。如何在不事先更改 SQL 文件编码的情况下完成这项工作?我想也许我应该使用.encode().decode(),但我不知道如何使用。

【问题讨论】:

  • 谢谢。我尝试将 query.read() 更改为 query.read().decode('utf-8-sig') 并得到“AttributeError:'str' object has no attribute 'decode'”。在这种情况下我将如何使用 .decode()?
  • 您可以先尝试编码字符串,然后重新解码query.read().encode("utf-8").decode()
  • 是否有无法转换为ANSI的字符?你确定是 UTF-8 而不是 UTF-16?
  • 对不起,我说的是解码,然后重新编码,而我的意思是相反的。最终,查询中的某个地方似乎存在错误编码(可能是换行符?),所以这就是您想要摆脱的。

标签: python sql-server pandas encoding pyodbc


【解决方案1】:

好的,问题解决了,我觉得自己很愚蠢。我试图使用.read() 两次——首先在print() 中,然后在read_sql_query() 中再次使用。我刚刚注释掉了print(query.read()),它运行良好。所以这毕竟不是编码问题。

当我之前使用 Notepad++ 在 ANSI 中对文件进行编码并让它工作时,我一定没有首先使用 print(query.read())。抱歉,这是我第一个使用open()read() 的程序。

【讨论】:

  • 现在我也觉得自己很笨!当然,您阅读了文件,因此没有什么可阅读的了。因此,通过查询发送的字符串长度为 0。
猜你喜欢
  • 1970-01-01
  • 2014-01-09
  • 2018-02-28
  • 2022-07-20
  • 1970-01-01
  • 2019-05-14
  • 2012-04-20
  • 2014-09-11
  • 2012-08-02
相关资源
最近更新 更多