批量转换txt文档编码与格式:解决直接修改后缀之后导入Obsidian出现的乱码问题

之前收集了几万部TXT小说,因为想把它们都导入到markdown的obsbian里,做一个集所有学习资料与备份文档的仓库方便以后导读,于是一开始只是在当前需要改txt文档的目录用cmd命令

ren *.txt *.md

执行了一下。它的作用是​​将当前目录下所有扩展名为 .txt的文件,批量重命名为扩展名为 .md的文件​​。

但是把批理修改后缀后的txt文档【修改后即*.md,(*代表当前目录下所有的文件命令)】

例如,执行命令后,当前目录下(包括当前目录下所有的子文件夹):

  • 笔记.txt→ 笔记.md
  • 报告.txt→ 报告.md

然后放到obsidian的仓库目录下,结果显示大部份文件全是乱码。

于是找了下原因,Obsidian 默认使用 ​​UTF-8​​ 编码来读取文件。Windows 系统默认创建的 .txt文本文件,编码通常是 ​​ANSI​​(在中文系统中通常对应 ​​GBK​​ 或 ​​GB2312​​)。简单的重命名(ren *.txt *.md)只改变了文件扩展名,并没有改变文件内部的编码格式。当编码不匹配时,乱码就会出现

然后再全部放到obsbian仓库目录下,是可以调用的,但是显示的全是乱码。我想了想肯定是因为字符编码不匹配,于是去查了一下如果obsidian是可以识别UTF-8字符编码的,出现了乱码的文档是因为在转后缀之前就不是UTF-8字符编码,所以才会出现这种情况。

解决方法:

新建一个txt文档,把以下代码复制进去,保存文件格式为py。(前提是电脑先要装python)

相当于做一个Python 脚本批量处理​​,,它能​​递归遍历指定目录及其所有子文件夹​​,批量将 .txt文件转换为 .md文件,并同时将文件编码从 ANSI (GBK) 转换为 UTF-8。

批量转换txt文档编码与格式:解决直接修改后缀之后导入Obsidian出现的乱码问题

然后再把这个文件放到需要批量修改txt文件的目录中,并在当前目录打开cmd,把这个py文件丢进去执行,或者直接命令提示符cd到该目录,执行即可。

批量转换txt文档编码与格式:解决直接修改后缀之后导入Obsidian出现的乱码问题
import os
import codecs

def rename_txt_to_md_and_convert_encoding(directory):
    # 遍历目录中的所有文件和子文件夹
    for root, _, files in os.walk(directory):
        for file_name in files:
            # 检查文件是否以.txt结尾
            if file_name.endswith('.txt'):
                # 构建旧文件路径和新文件路径
                old_file_path = os.path.join(root, file_name)
                new_file_path = os.path.join(root, file_name.replace('.txt', '.md'))
                
                # 检查目标文件是否已经存在
                if not os.path.exists(new_file_path):
                    # 重命名文件
                    os.rename(old_file_path, new_file_path)
                    print(f'将文件 {old_file_path} 重命名为 {new_file_path}')
                    
                    # 尝试将ANSI编码的文件转换为UTF-8编码
                    try:
                        with codecs.open(new_file_path, 'r', 'ansi') as ansi_file:
                            utf8_content = ansi_file.read()
                        with codecs.open(new_file_path, 'w', 'utf-8') as utf8_file:
                            utf8_file.write(utf8_content)
                        print(f'已将文件 {new_file_path} 从ANSI转换为UTF-8')
                    except Exception as e:
                        print(f'无法处理文件 {new_file_path}: {e}')
                else:
                    print(f'目标文件 {new_file_path} 已经存在,跳过重命名')

# 指定要修改的根文件夹路径
root_folder_path = r'G:\PoetNode\poetnote\Novel\change' # 请修改为你的实际文件夹路径
# 调用函数来递归修改文件扩展名和文件编码
rename_txt_to_md_and_convert_encoding(root_folder_path)
print('批量修改文件扩展名和文件编码完成')