You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现SQL文件注释移除时读取文件内容处理失效问题求助

问题原因
  • 编码不匹配:打开SQL文件时未显式指定编码,Windows系统默认使用GBK编码读取文件,若你的SQL文件为UTF-8等其他编码,会导致读取内容乱码,/*、*/、--等注释标记无法被正常识别。硬编码测试时字符串直接使用Python内置Unicode编码,不存在编码转码问题,所以可以正常执行。
  • 仅实现了/* */块注释移除逻辑,缺少--行注释的处理逻辑,和你的需求不符。
  • 未排除SQL字符串常量中的注释标记,若SQL内容中存在类似select '/*测试*/' from table的写法,现有逻辑会误删字符串内的内容,硬编码测试未覆盖这类场景所以不会触发问题。
可行解决方案

修正后的代码如下,核心改动点:

  1. 所有文件读写操作显式指定编码,兼容绝大多数场景,可根据你的文件实际编码调整参数
  2. 新增--行注释的移除逻辑,同时添加SQL字符串匹配规则,避免误删字符串内的类注释标记
  3. 用with上下文管理器自动管理文件句柄,避免异常场景下文件资源泄漏
  4. 解析器全局只初始化一次,提升批量处理效率
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 08:24:00