pandas read_sql_query读取UTF-8编码SQL文件报错如何解决?
问题根因
- 直接诱因:你对同一个文件句柄连续调用了两次
read()方法,第一次print(query.read())执行完成后,文件指针已经移动到文件末尾,第二次执行pd.read_sql_query(query.read(), cnxn)时读到的是空字符串,对应报错提示里的Invalid string or buffer length (0)。 - 编码问题:Windows系统下
open()方法默认使用GBK(也就是你说的ANSI)编码打开文件,你的SQL文件是UTF-8编码,文件内含非ASCII字符时读取就会出现异常,和你修改编码后可正常运行的表现一致。
解决代码
打开文件时直接指定UTF-8编码,同时把SQL内容存入变量避免二次读取即可,不需要额外调用编解码方法:
import pyodbc import pandas as pd # 用with上下文管理器自动管理文件句柄,指定UTF-8编码读取,内容存变量复用 with open('test.sql', 'r', encoding='utf-8') as f: query_sql = f.read() print(query_sql) 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_sql, cnxn) print(df.head())
- 补充说明:如果你的UTF-8 SQL文件是带BOM头的(部分Windows编辑器保存UTF-8文件时默认会加BOM头),把
encoding参数值换成utf-8-sig即可自动忽略BOM头,避免解析异常。
内容的提问来源于stack exchange,提问作者34293045
相关产品推荐
相关产品推荐

