之前收集了几万部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文件的目录中,并在当前目录打开cmd,把这个py文件丢进去执行,或者直接命令提示符cd到该目录,执行即可。

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('批量修改文件扩展名和文件编码完成')