├── README.md └── wechat_read_note_convertor.py /README.md: -------------------------------------------------------------------------------- 1 | # WeChatRead_NoteConvertor 2 | 3 | --- 4 | 5 | 将微信读书默认导出的笔记格式转化为标准markdown,方便同步到自己的笔记工具。 6 | 7 | ### 功能 8 | 9 | - **笔记格式调整**:将微信读书默认导出的笔记标题从“◆”改为“###”,笔记条目从“>>”改为“-”,想法条目前添加“>”并移动至对应笔记之后; 10 | - **删除重复笔记**:划线后再写想法的笔记在从微信读书导出时会重复记录,程序会帮助你去重; 11 | - **删除空白行数**:删除原markdown中的空行; 12 | 13 | ### 用法 14 | 1. 将微信读书的笔记复制到剪贴板,建立markdown文件并粘贴; 15 | 2. 将此`.py`文件移动至笔记目录,确保目录下只有待转换格式的markdown文件; 16 | 3. 打开终端,在终端中打开该目录,执行命令:`python3 wechat_read_note_converter.py`; 17 | 4. 该目录下的所有markdown文件会被自动转化为更适合阅读的格式,转化后的文件会加上后缀“_converted”。 18 | 19 | -------------------------------------------------------------------------------- /wechat_read_note_convertor.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import os 4 | 5 | 6 | # 通过打开系统目录读取原始markdown文件 7 | def read_markdown_file(path): 8 | with open(path, 'r', encoding='utf-8') as f: 9 | data = f.read() 10 | return data 11 | 12 | 13 | # 在换行的笔记前添加">> " 14 | def add_symbol_to_note(data): 15 | lines = data.split('\n') 16 | for i in range(len(lines)): 17 | if lines[i] != '' and lines[i+1] != '' and lines[i][0] == '>': 18 | lines[i+1] = '>> ' + lines[i+1] 19 | return '\n'.join(lines) 20 | 21 | 22 | # 替换data中的">>"为"-"(笔记),替换data中的"◆"为"###"(标题) 23 | def replace_markdown_symbol(data): 24 | data = data.replace('>>', '-') 25 | data = data.replace('◆', '###') 26 | return data 27 | 28 | 29 | # 在data中每一行不以"-"和"###"开头的有内容的正文(即自己的想法)前加上"> "作为引用 30 | def add_markdown_symbol(data): 31 | lines = data.split('\n') 32 | for i in range(len(lines)): 33 | if lines[i] != '' and lines[i][0] != '-' and lines[i][0] != '#': 34 | lines[i] = '> ' + lines[i] 35 | return '\n'.join(lines) 36 | 37 | 38 | # 删除空行 39 | def delete_empty_line(data): 40 | lines = data.split('\n') 41 | for i in range(len(lines)-1, -1, -1): 42 | if lines[i] == '': 43 | del lines[i] 44 | return '\n'.join(lines) 45 | 46 | 47 | # 删除内容重复的行 48 | def delete_repeat_line(data): 49 | lines = data.split('\n') 50 | for i in range(len(lines)-1, -1, -1): 51 | for j in range(len(lines)-1, -1, -1): 52 | if i != j and lines[i] == lines[j]: 53 | del lines[i] 54 | return '\n'.join(lines) 55 | 56 | 57 | # 除了前三行之外,将以"> "开头的行数与后面那行位置互换(将想法放到笔记后面) 58 | def exchange_lines(data): 59 | lines = data.split('\n') 60 | jump = False 61 | for i in range(3, len(lines)-1): 62 | if jump: 63 | jump = False 64 | continue 65 | jump = True if lines[i][0] == '>' else False 66 | if lines[i][0] == '>': 67 | lines[i], lines[i+1] = lines[i+1], lines[i] 68 | return '\n'.join(lines) 69 | 70 | 71 | # 将第一行的"> "替换为"# "(书籍名作为一级标题) 72 | def replace_first_line(data): 73 | lines = data.split('\n') 74 | lines[0] = lines[0].replace('> ', '# ') 75 | return '\n'.join(lines) 76 | 77 | 78 | # 将第二行与第三行互换位置,将此时第二行的"> "替换为"**(",并在第二行末尾加上")**"(调整作者的位置,加粗笔记数量) 79 | def exchange_second_and_third_line(data): 80 | lines = data.split('\n') 81 | lines[1], lines[2] = lines[2], lines[1] 82 | lines[1] = lines[1].replace('> ', '**(') + ')**' 83 | return '\n'.join(lines) 84 | 85 | 86 | # 将data写入以"原文件名+"+"_converted"+"md"的形式命名的新的markdown文件 87 | def write_markdown_file(data, path): 88 | # 获取文件名 89 | file_name = os.path.basename(path) 90 | # 创建新的文件名 91 | new_file_name = file_name.replace('.md', '_converted.md') 92 | # 创建以新的文件名命名的markdown文件 93 | with open(new_file_name, 'w', encoding='utf-8') as f: 94 | f.write(data) 95 | 96 | 97 | # 主程序 98 | def main(): 99 | current_dir = os.getcwd() 100 | files = os.listdir(current_dir) 101 | for file in files: 102 | if file.endswith('.md'): 103 | data = read_markdown_file(file) 104 | data = add_symbol_to_note(data) 105 | data = replace_markdown_symbol(data) 106 | data = add_markdown_symbol(data) 107 | data = delete_empty_line(data) 108 | data = delete_repeat_line(data) 109 | data = exchange_lines(data) 110 | data = replace_first_line(data) 111 | data = exchange_second_and_third_line(data) 112 | write_markdown_file(data, file) 113 | 114 | 115 | if __name__ == '__main__': 116 | main() 117 | --------------------------------------------------------------------------------