下载图片

从指定的 Typora Markdown 文件中提取所有图片链接,并将这些图片下载到本地的 downloaded_images 文件夹中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import os
import re
import requests
from tkinter import filedialog
import tkinter as tk

# 创建一个 Tkinter 窗口
root = tk.Tk()
root.withdraw() # 隐藏主窗口

# 让用户选择一个 Typora 文件
typora_file_path = filedialog.askopenfilename(title="选择 Typora 文件", filetypes=[("Markdown 文件", "*.md")])

# 检查是否选择了文件
if not typora_file_path:
print("未选择文件,退出...")
exit()

# 读取选定的 Typora 文件内容
with open(typora_file_path, 'r', encoding='utf-8') as file:
content = file.read()

# 使用正则表达式查找所有图片链接
img_links = re.findall(r'!\[.*?\]\((.*?)\)', content)

# 创建一个目录来保存下载的图片
if not os.path.exists('downloaded_images'):
os.mkdir('downloaded_images')

# 下载并重命名图片
for i, img_link in enumerate(img_links):
response = requests.get(img_link)
if response.status_code == 200:
# 提取文件扩展名
file_extension = os.path.splitext(img_link)[-1]
# 构建一个新文件名
new_filename = f'downloaded_images/{i + 1}{file_extension}'
# 保存图片
with open(new_filename, 'wb') as img_file:
img_file.write(response.content)
print(f'下载成功: {new_filename}')
else:
print(f'下载失败: {img_link}')

print('图片下载完成。')

确保已安装所需的Python库,可以使用以下命令安装:

1
pip install requests

您可以使用上面提供的Python代码来下载Typora文件中的图片。以下是如何使用这个Python脚本的步骤:

  1. 复制上面的Python代码并粘贴到一个文本编辑器中(如Notepad++或Visual Studio Code)。

  2. 保存脚本文件并确保文件扩展名为.py(例如download_typora_images.py)。

  3. 打开命令行终端(例如cmd或终端)。

  4. 在终端中,导航到包含脚本文件的目录,使用cd命令切换到该目录,例如:

    1
    cd /path/to/script/directory
  5. 运行脚本,使用以下命令:

    1
    python download_typora_images.py

    确保您已安装了Python,并且python命令可以在命令行中正常运行。

  6. 脚本将开始执行,根据Typora文件中的图片链接下载图片,并将它们以阿拉伯数字从小到大命名,保存在名为downloaded_images的文件夹中。

请注意,脚本执行完成后,您将在脚本文件的目录中看到一个名为downloaded_images的文件夹,其中包含下载的图片。确保在运行脚本之前备份Typora文件,以防万一。

替换域名

需求背景:hexo的_post文章目录下有50多个.md格式的文件,每个文件里面有图片链接,更换新的图床的域名。

功能:批量在指定文件夹中的所有 .md 文件中执行查找和替换操作。选择一个文件夹,并通过自定义对话框输入查找文本、替换文本以及选择是否使用正则表达式。然后,程序遍历文件夹中的所有 Markdown 文件,执行文本替换操作,若内容发生变化,会将修改后的内容写回文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import os
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter.simpledialog import Dialog
import re

# 自定义对话框类,用于查找和替换文本输入
class SearchReplaceDialog(Dialog):
def __init__(self, parent):
self.search_text = ""
self.replace_text = ""
self.use_regex = False
super().__init__(parent, title="查找和替换")

def body(self, master):
tk.Label(master, text="查找文本:").grid(row=0)
tk.Label(master, text="替换文本:").grid(row=1)

self.search_entry = tk.Entry(master)
self.replace_entry = tk.Entry(master)

self.search_entry.grid(row=0, column=1)
self.replace_entry.grid(row=1, column=1)

# 模式选择:全局替换 or 正则表达式
self.mode_var = tk.BooleanVar(value=False)
tk.Radiobutton(master, text="全局替换", variable=self.mode_var, value=False).grid(row=2, column=0, columnspan=2)
tk.Radiobutton(master, text="正则表达式", variable=self.mode_var, value=True).grid(row=2, column=1, columnspan=2)

return self.search_entry # 初始聚焦

def apply(self):
self.search_text = self.search_entry.get()
self.replace_text = self.replace_entry.get()
self.use_regex = self.mode_var.get()

# 主函数
def main():
# 创建主窗口并隐藏
root = tk.Tk()
root.withdraw()

# 选择文件夹
folder_path = filedialog.askdirectory(title="请选择文件夹")
if not folder_path:
print("未选择文件夹,操作取消。")
return

# 显示查找和替换对话框
dialog = SearchReplaceDialog(root)
search_text = dialog.search_text
replace_text = dialog.replace_text
use_regex = dialog.use_regex

if not search_text or not replace_text:
print("查找或替换文本为空,操作取消。")
return

# 遍历目录中的所有 .md 文件
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith(".md"):
file_path = os.path.join(root, file)

# 打开文件并读取内容,确保使用 UTF-8 编码
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()

# 替换内容,增加 re.DOTALL 以匹配多行文本
if use_regex:
# 使用 re.DOTALL 标志以匹配跨多行的文本
new_content = re.sub(search_text, replace_text, content, flags=re.DOTALL)
else:
new_content = content.replace(search_text, replace_text)

# 如果内容发生变化,则写回文件
if content != new_content:
with open(file_path, 'w', encoding='utf-8') as f:
f.write(new_content)
print(f"替换成功:{file_path}")
else:
print(f"未发现替换内容:{file_path}")

print("替换操作完成!")

# 运行主函数
if __name__ == "__main__":
main()

生成树状目录结构

功能:win10环境生成树状目录结构

先安装treelib

1
pip install treelib
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from tkinter import Tk, filedialog, simpledialog
import sys
from pathlib import Path
from treelib import Tree

def select_root_directory():
# 创建 Tkinter 窗口(隐藏主窗口)
root = Tk()
root.withdraw()

# 打开目录选择弹窗
folder_selected = filedialog.askdirectory(title="请选择根目录")
if not folder_selected:
print("未选择目录,程序退出。")
sys.exit()
return folder_selected

def build_tree(tree, root_path, depth, parent=None, level=0):
# 递归生成目录树
if level > depth:
return
root_path = Path(root_path)
node_name = root_path.name
if parent is None:
tree.create_node(node_name, root_path, parent=parent) # 创建根节点
else:
tree.create_node(node_name, root_path, parent=parent) # 创建子节点

# 遍历子文件夹
for child in root_path.iterdir():
if child.is_dir():
build_tree(tree, child, depth, root_path, level + 1)

def save_tree_to_file(tree, output_file="directory_structure.txt"):
# 使用 ASCII 树状结构并替换 `+--` 为 `└──`
tree_output = tree.show(line_type="ascii", stdout=False)
tree_output = tree_output.replace('+--', '└──') # 替换 `+--` 为 `└──`
with open(output_file, 'w', encoding='utf-8') as f:
f.write(tree_output)
print(f"目录结构已保存到 {output_file}")

if __name__ == "__main__":
# 选择根目录
root_dir = select_root_directory()

# 输入显示的目录级数
Tk().withdraw() # 隐藏主窗口
max_depth = simpledialog.askinteger("输入目录级数", "请输入要显示的目录层级:", minvalue=1)

# 创建目录树
directory_tree = Tree()
build_tree(directory_tree, root_dir, max_depth)

# 输出目录结构到 txt 文件
save_tree_to_file(directory_tree)

提取链接

需求背景:使用批量准转存夸克云盘链接工具的时候需要把云盘分享链接一行一个的保存到txt文件里面。

功能:从选择的 .txt 文件中提取所有 HTTP 或 HTTPS 开头的链接,并将这些链接保存到一个新的文本文件中。通过文件选择对话框选取文件后,程序读取文件内容并使用正则表达式提取链接。提取到的链接会被写入一个新文件,文件名是原文件名加上 _links_only 后缀。如果没有找到链接,则会显示提示信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import tkinter as tk
from tkinter import filedialog
import re

def extract_links_from_text(text):
# 使用正则表达式匹配 HTTP 或 HTTPS 开头的链接
return re.findall(r'https?://[^\s]+', text)

def main():
# 创建文件选择窗口
root = tk.Tk()
root.withdraw() # 隐藏主窗口

# 打开文件选择对话框
file_path = filedialog.askopenfilename(filetypes=[("Text files", "*.txt")])
if not file_path:
print("未选择文件")
return

# 读取文件内容
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read()

# 提取链接
links = extract_links_from_text(content)

# 如果有链接,写入到新的文件
if links:
output_path = file_path.replace('.txt', '_links_only.txt')
with open(output_path, 'w', encoding='utf-8') as output_file:
for link in links:
output_file.write(link + '\n')
print(f"提取的链接已保存到:{output_path}")
else:
print("未找到链接")

if __name__ == "__main__":
main()