1. 版本、依赖要求
Python 版本要求:Python >= 3.6
即可
需要安装的包(建议使用 conda、miniconda 等 python 环境管理器创建一个 python 环境后运行
- chardet
- tkinter
2. 实现功能
对某一文件夹及其子文件夹下的所有txt
文件,将原编码为gb2312
或UTF8
编码的文件,统一转换为带标签的UTF8 (UTF8 With BOM)
编码
3. 具体代码
软件代码使用【通义千问】生成
import os
import tkinter as tk
from tkinter import filedialog
import codecs
try:
from chardet import detect
# 此包是否安装,如果未安装则退出
except ImportError:
print("Please install the chardet library: pip install chardet")
exit(1)
def convert_to_utf8_with_bom(file_path):
"""将文件从当前编码转换为UTF-8 with BOM"""
with open(file_path, 'rb') as file:
# 读取原始编码的文件内容
content = file.read()
with open(file_path, 'wb') as file:
file.write(content)
# 尝试使用gb2312编码解码内容,因为gb2312编码是windows系统默认的编码
try:
print('尝试使用gb2312解码内容...')
content_decoded = content.decode('gb2312')
except UnicodeDecodeError:
# 如果gb2312解码失败,说明文件不是gb2312编码,尝试使用utf-8解码
try:
print('尝试使用utf8解码内容...')
content_decoded = content.decode('utf-8')
except UnicodeDecodeError:
# 如果utf-8解码失败,说明文件编码无法识别,跳过此文件
print(f"解码错误:无法识别{file_path}的原始编码,跳过此文件。")
return
# 重新编码为UTF-8 with BOM
content_utf8_with_bom = content_decoded.encode('utf-8-sig')
# 写回文件,覆盖原文件为UTF-8 with BOM编码
with open(file_path, 'wb') as file:
file.write(content_utf8_with_bom)
def process_folder(folder_path):
"""处理指定文件夹内的所有txt文件"""
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith('.txt'):
file_path = os.path.join(root, file)
print(f"转换中: {file_path}")
convert_to_utf8_with_bom(file_path)
print(f"完成: {file_path}")
def select_folder():
"""使用tkinter打开文件选择对话框选择文件夹"""
root = tk.Tk()
root.withdraw() # 隐藏主窗口
folder_path = filedialog.askdirectory() # 弹出文件夹选择对话框
if folder_path:
print(f"选择的文件夹: {folder_path}")
process_folder(folder_path)
root.destroy()
if __name__ == "__main__":
select_folder()
4. 使用方法
- 执行脚本
- 弹窗选择文件夹
- 自动将文件夹、子文件夹内所有
.txt
文件转换编码,并输出转换结果- 转换中:文件名
- 尝试解码的信息
- 尝试使用 gb2312 解码
- 尝试使用 utf8 解码
- 解码错误:无法识别{ 文件名 }的原始编码,跳过此文件。
- 完成:文件名