Python实现SQL文件注释移除时读取文件内容处理失效问题求助
问题原因
- 编码不匹配:打开SQL文件时未显式指定编码,Windows系统默认使用GBK编码读取文件,若你的SQL文件为UTF-8等其他编码,会导致读取内容乱码,
/*、*/、--等注释标记无法被正常识别。硬编码测试时字符串直接使用Python内置Unicode编码,不存在编码转码问题,所以可以正常执行。 - 仅实现了
/* */块注释移除逻辑,缺少--行注释的处理逻辑,和你的需求不符。 - 未排除SQL字符串常量中的注释标记,若SQL内容中存在类似
select '/*测试*/' from table的写法,现有逻辑会误删字符串内的内容,硬编码测试未覆盖这类场景所以不会触发问题。
可行解决方案
修正后的代码如下,核心改动点:
- 所有文件读写操作显式指定编码,兼容绝大多数场景,可根据你的文件实际编码调整参数
- 新增
--行注释的移除逻辑,同时添加SQL字符串匹配规则,避免误删字符串内的类注释标记 - 用
with上下文管理器自动管理文件句柄,避免异常场景下文件资源泄漏 - 解析器全局只初始化一次,提升批量处理效率
import re import os import pyparsing dst = "C:\\Users\\user1\\Desktop\\temp\\XYZ\\" src = "C:\\Users\\user1\\Desktop\\temp\\ABC\\" # 提前初始化解析规则 # 匹配SQL单/双引号字符串,保留内容不处理 sql_string = pyparsing.quotedString.copy() # 匹配/* */块注释,直接移除 block_comment = pyparsing.nestedExpr("/*", "*/").suppress() # 匹配--开头的行注释,直接移除 line_comment = pyparsing.Regex(r'--.*?$', flags=re.MULTILINE).suppress() # 组合规则:优先保留字符串,再移除两类注释 comment_parser = block_comment | line_comment | sql_string with open("C:\\Users\\user1\\Desktop\\SPs\\sample.txt", "r", encoding="utf-8") as a_file: for line in a_file: stripped_line = line.strip() if not stripped_line: continue src_path = os.path.join(src, stripped_line) dst_path = os.path.join(dst, stripped_line) try: # 读取源文件,编码可根据实际情况改为gbk等 with open(src_path, "r", encoding="utf-8") as s_file: filedata = s_file.read() # 执行注释移除 processed_data = comment_parser.transformString(filedata) # 写入目标文件 with open(dst_path, "w", encoding="utf-8", newline='') as o_file: o_file.write(processed_data) except Exception as e: print(f'Error: 处理文件{stripped_line}失败,{str(e)}') print('Successfully completed!')
如果执行后仍有问题,可以先打印读取到的filedata变量内容,确认和原文件内容一致,排查编码匹配问题。
内容的提问来源于stack exchange,提问作者annonymous 007
相关产品推荐
相关产品推荐

