""" 全角字符转半角字符工具脚本 用于将Python文件中的全角括号、逗号等字符转换为半角 """ import sys from pathlib import Path def fullwidth_to_halfwidth(text: str) -> str: """ 将文本中的全角字符转换为半角字符 Args: text: 输入文本 Returns: 转换后的文本 """ # 定义全角到半角的映射 fullwidth_chars = { "(": "(", ")": ")", ",": ",", ";": ";", ":": ":", "。": ".", "?": "?", "!": "!", """: '"', "'": "'", "[": "[", "]": "]", "{": "{", "}": "}", " ": " ", # 全角空格 } # 处理每个字符 result = [] for char in text: result.append(fullwidth_chars.get(char, char)) return "".join(result) def convert_file(file_path: Path) -> bool: """ 转换单个文件中的全角字符 Args: file_path: 文件路径 Returns: 如果文件被修改则返回True,否则返回False """ if not file_path.exists(): print(f"文件不存在: {file_path}") return False if file_path.suffix != ".py": print(f"跳过非Python文件: {file_path}") return False # 忽略自身文件,防止无限循环 if file_path.name == "fullwidth_to_halfwidth_converter.py": print(f"跳过自身文件: {file_path}") return False # 读取原始内容 with open(file_path, encoding="utf-8") as f: original_content = f.read() # 转换全角字符 converted_content = fullwidth_to_halfwidth(original_content) # 如果内容发生了变化,则写回文件 if original_content != converted_content: print(f"转换文件: {file_path}") with open(file_path, "w", encoding="utf-8") as f: f.write(converted_content) return True return False def convert_files_in_directory(directory: Path, pattern: str = "*.py") -> int: """ 转换目录下所有匹配模式的文件 Args: directory: 目录路径 pattern: 文件匹配模式 Returns: 修改的文件数量 """ if not directory.exists(): print(f"目录不存在: {directory}") return 0 python_files = list(directory.rglob(pattern)) modified_count = 0 for file_path in python_files: if convert_file(file_path): modified_count += 1 return modified_count def main(): """主函数,处理命令行参数""" if len(sys.argv) < 2: print("使用示例:") print(" 处理单个文件: python fullwidth_to_halfwidth_converter.py ./main.py") print(" 处理多个文件: python fullwidth_to_halfwidth_converter.py " "file1.py file2.py file3.py") print(" 处理整个目录: python fullwidth_to_halfwidth_converter.py ./src") sys.exit(1) modified_count = 0 total_files = 0 # 处理所有传入的路径参数(支持多文件和目录) for path_arg in sys.argv[1:]: target_path = Path(path_arg) if target_path.is_file(): # 处理单个文件 total_files += 1 if convert_file(target_path): modified_count += 1 elif target_path.is_dir(): # 处理目录下的所有Python文件 pattern = "*.py" dir_modified = convert_files_in_directory(target_path, pattern) modified_count += dir_modified # 统计目录中的文件数 total_files += len(list(target_path.rglob(pattern))) else: print(f"⚠️ 路径不存在: {target_path}") # 输出处理结果 if total_files > 0: print(f"✅ 处理完成: 共检查 {total_files} 个文件,转换了 {modified_count} 个文件") else: print("⚠️ 没有找到需要处理的文件") # 如果有文件被修改,返回非零状态码,通知pre-commit需要重新暂存 sys.exit(1 if modified_count > 0 else 0) if __name__ == "__main__": main()