Python读取latin1编码多查询SQL脚本:空格与起始ASCII字符问题
问题解决:读取SQL脚本时的乱码与字符间隔问题
问题根源
你遇到的ÿþ前缀和字符间空格,本质是编码不匹配导致的:
ÿþ是UTF-16 LE编码的字节顺序标记(BOM),你的SQL脚本实际是UTF-16编码保存的,但你用单字节的latin1编码读取,导致BOM被解析成了两个乱码字符。- 字符间的空格是因为UTF-16每个字符占2字节,用
latin1读取时会把每个字节单独解析成字符,其中的空字节(\x00)显示为空格。
解决方案
方案1:用正确编码读取文件
直接指定utf-16编码读取,Python会自动处理BOM,从根源解决乱码问题:
import os str_sql_file= os.path.join(CONFIG.STR_ROOT_FOLDER, 'sql', CONFIG.STR_SQL_FILE_STEP_ONE) # 使用utf-16编码读取,自动识别并移除BOM with open(str_sql_file, 'r', encoding='utf-16') as file_sql_tmp: str_sql = file_sql_tmp.read()
方案2:手动清理BOM与乱码(适用于编码不确定的场景)
如果无法确定文件编码,可以先读取字节流,手动移除BOM后再转成正确字符串:
import os str_sql_file= os.path.join(CONFIG.STR_ROOT_FOLDER, 'sql', CONFIG.STR_SQL_FILE_STEP_ONE) with open(str_sql_file, 'rb') as file_sql_tmp: byte_content = file_sql_tmp.read() # 移除UTF-16 LE的BOM(对应字节为0xFF 0xFE) if byte_content.startswith(b'\xff\xfe'): byte_content = byte_content[2:] # 解码为UTF-16字符串 str_sql = byte_content.decode('utf-16le')
进阶优化:安全拆分SQL语句
直接用分号拆分SQL存在风险(比如字符串或注释中包含分号),推荐用sqlparse库做专业拆分:
- 先安装库:
pip install sqlparse
- 拆分执行:
import sqlparse # 智能拆分SQL语句,自动忽略注释、字符串中的分号 statements = sqlparse.split(str_sql) for stmt in statements: # 跳过空语句 if stmt.strip(): print('executing sql: \n {}'.format(stmt))
内容的提问来源于stack exchange,提问作者Sade
相关产品推荐
相关产品推荐

