155 lines
4.1 KiB
Python
155 lines
4.1 KiB
Python
|
|
"""
|
|||
|
|
全角字符转半角字符工具脚本
|
|||
|
|
用于将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()
|