51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

用python写一个简易的字符串替换工具

这篇文章的内容很简单,记录的内容也没有太多知识点,很简单(水文);

需求很简单,就是可以上传一个 markdown 文件,设定一个待替换字符串和一个替换字符串,能自动替换后保存下来;

需求场景就是图片链接的域名发生变化之后能够快速的切换地址;

replace方法 {#replace方法}

这个很简单,直接使用 python 中字符串(str)对象的方法 replace()即可;

replace()方法接受两个或三个参数:

  1. old:需要被替换的旧子串。
  2. new:用来替换旧子串的新子串。
  3. count(可选):需要替换的最大次数。如果未指定或为负数,则替换所有匹配项。

方法的语法如下:

str.replace(old, new[, count])

返回值是一个新的字符串,其中所有的 old 子串都被 new 替换了,而原始字符串 str 保持不变(因为字符串是不可变的)。

下面是一些使用 replace() 方法的例子:

# 替换所有匹配项
s = "Hello world, world is great."
new_s = s.replace("world", "Python")
print(new_s)  # 输出: Hello Python, Python is great.

替换指定次数的匹配项

s = "aaa" new_s = s.replace("a", "b", 2) # 只替换前两个'a' print(new_s) # 输出: bba


使用tkinter写一个gui程序 {#使用tkinter写一个gui程序}

要支持选择文件,输出文件的话,还是有个界面可以选择比较方便,所以写个 gui 程序应该会不错;

这也很简单,具体的实现方法看注释:

# 导入Tkinter库,并为其设置别名tk,用于创建GUI
import tkinter as tk
# 从tkinter库中导入filedialog和messagebox模块,分别用于文件选择对话框和消息提示框
from tkinter import filedialog, messagebox
# 导入os模块,用于处理文件和目录的路径
import os

定义一个函数select_file,用于打开文件选择对话框并选择Markdown文件

def select_file():

使用filedialog.askopenfilename打开文件选择对话框,设置文件类型为Markdown文件

file_path = filedialog.askopenfilename(filetypes=[("Markdown files", "*.md")])

选择文件,将文件路径设置到file_path_var变量中

if file_path: file_path_var.set(file_path)

定义一个函数replace_text,用于替换文件中的文本并保存

def replace_text():

从变量中获取文件路径、待替换的文本和替换后的文本

file_path = file_path_var.get() target_text = target_text_var.get() replacement_text = replacement_text_var.get()

# 如果没有选择文件或者文件路径无效,显示错误消息并返回
if not file_path or not os.path.isfile(file_path):
    messagebox.showerror("错误", "请选择一个有效的 Markdown 文件")
    return

# 如果没有填写待替换的字符串,显示错误消息并返回
if not target_text:
    messagebox.showerror("错误", "请填写待替换字符串")
    return

try:
    # 以只读模式打开文件,并读取内容
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()

    # 使用str.replace方法替换文件中的文本
    updated_content = content.replace(target_text, replacement_text)

    # 打开保存文件的对话框,让用户选择保存路径和文件名
    save_path = filedialog.asksaveasfilename(defaultextension=".md", filetypes=[("Markdown files", "*.md")])
    # 如果用户取消保存操作,直接返回
    if not save_path:
        return  # 用户取消保存操作

    # 以写入模式打开文件,并将更新后的内容写入
    with open(save_path, 'w', encoding='utf-8') as f:
        f.write(updated_content)

    # 显示成功消息提示框,告知用户替换完成并已保存
    messagebox.showinfo("成功", "替换完成,文件已保存")
except Exception as e:
    # 如果在处理文件时出现异常,显示错误消息提示框,并显示异常信息
    messagebox.showerror("错误", f"处理文件时出错: {e}")

创建Tkinter的主窗口,并设置窗口标题

root = tk.Tk() root.title("Markdown 替换工具")

定义三个StringVar变量,用于存储文件路径、待替换的文本和替换后的文本

file_path_var = tk.StringVar() target_text_var = tk.StringVar() replacement_text_var = tk.StringVar()

创建文件选择部分的框架,并添加标签、输入框和按钮

file_frame = tk.Frame(root) file_frame.pack(pady=10) tk.Label(file_frame, text="选择 Markdown 文件:").pack(side=tk.LEFT) tk.Entry(file_frame, textvariable=file_path_var, width=40).pack(side=tk.LEFT, padx=5) tk.Button(file_frame, text="浏览", command=select_file).pack(side=tk.LEFT)

创建待替换字符串输入部分的框架,并添加标签和输入框

target_frame = tk.Frame(root) target_frame.pack(pady=10) tk.Label(target_frame, text="待替换字符串:").pack(side=tk.LEFT) tk.Entry(target_frame, textvariable=target_text_var, width=40).pack(side=tk.LEFT, padx=5)

创建替换字符串输入部分的框架,并添加标签和输入框

replacement_frame = tk.Frame(root) replacement_frame.pack(pady=10) tk.Label(replacement_frame, text="替换字符串:").pack(side=tk.LEFT) tk.Entry(replacement_frame, textvariable=replacement_text_var, width=40).pack(side=tk.LEFT, padx=5)

创建替换按钮,并设置点击时执行replace_text函数

tk.Button(root, text="替换并保存", command=replace_text).pack(pady=20)

启动Tkinter的事件循环,显示窗口

root.mainloop()


实现效果:

image-20241108154214196

使用Fastapi写一个在线的程序 {#使用fastapi写一个在线的程序}

纯属是自己想折腾,fastapi 主要代码如下:

from fastapi import FastAPI, UploadFile, Form
from fastapi.responses import FileResponse
from fastapi.middleware.cors import CORSMiddleware
import tempfile

app = FastAPI()

配置 CORS

app.add_middleware( CORSMiddleware, allow_origins=["*"], # 允许所有来源的跨域请求(在生产环境可以指定特定的前端域名) allow_credentials=True, allow_methods=["*"], # 允许所有的 HTTP 方法 allow_headers=["*"], # 允许所有的请求头 )

@app.post("/replace-text/") async def replace_text(file: UploadFile, target_text: str = Form(...), replacement_text: str = Form(...)):

创建一个临时文件存储更新后的内容

with tempfile.NamedTemporaryFile(delete=False, suffix=".md") as temp_file:

读取上传的文件内容

content = await file.read() content = content.decode("utf-8")

    # 执行文本替换
    updated_content = content.replace(target_text, replacement_text)

    # 将更新后的内容写入临时文件
    temp_file.write(updated_content.encode("utf-8"))
    temp_file_path = temp_file.name

# 返回替换后的文件
return FileResponse(temp_file_path, media_type='text/markdown', filename="updated_file.md")


运行结果:
image-20241108154709796

有了接口之后,使用 swagger 去使用也并不是一个好的选择;

来,再简单实现一个网页:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Markdown 替换工具</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<div class="container mt-5">
    <h2 class="text-center">Markdown 替换工具</h2>
    <form id="replaceForm" enctype="multipart/form-data">
        <div class="mb-3">
            <label for="fileInput" class="form-label">选择 Markdown 文件</label>
            <input type="file" class="form-control" id="fileInput" name="file" required>
        </div>
        <div class="mb-3">
            <label for="targetText" class="form-label">待替换字符串</label>
            <input type="text" class="form-control" id="targetText" name="target_text" placeholder="输入待替换字符串" required>
        </div>
        <div class="mb-3">
            <label for="replacementText" class="form-label">替换字符串</label>
            <input type="text" class="form-control" id="replacementText" name="replacement_text" placeholder="输入替换字符串" required>
        </div>
        <button type="submit" class="btn btn-primary">替换并下载</button>
    </form>
</div>

&lt;script&gt; $(document).ready(function () { $('#replaceForm').on('submit', function (e) { e.preventDefault();

        // 获取表单数据
        let formData = new FormData(this);

        // 调用后端 API
        $.ajax({
            url: 'http://127.0.0.1:8000/replace-text/', // 确保这里的地址和后端保持一致
            type: 'POST',
            data: formData,
            processData: false,
            contentType: false,
            xhrFields: {
                responseType: 'blob' // 确保响应为 blob 数据类型
            },
            success: function (data) {
                // 创建一个下载链接,点击下载文件
                const downloadUrl = URL.createObjectURL(data);
                const a = document.createElement('a');
                a.href = downloadUrl;
                a.download = &quot;updated_file.md&quot;; // 自定义文件名
                document.body.appendChild(a);
                a.click();
                a.remove();
                URL.revokeObjectURL(downloadUrl);
            },
            error: function (xhr, status, error) {
                alert(&quot;替换失败: &quot; + xhr.responseText || error);
            }
        });
    });
});

&lt;/script&gt;

&lt;script src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js&quot;&gt;&lt;/script&gt; &lt;/body&gt; &lt;/html&gt;


完工!这里也算是又摸了摸老古董!

image-20241108154853580

总结 {#总结}

如果你是刚学习编程,你看完可能会有所收获,因为这篇文章这里面的东西真的是简单,而且没有太多的意义;因为要实现上面这么简单的需求,根本不用这么麻烦;基本常见的编辑器也都能实现批量替换的功能;
主要就是手痒痒,想写写看。

那么这里也再推荐一个在线的工具:https://www.lddgo.net/string/text-replace

image-20241108155412556

赞(1)
未经允许不得转载:工具盒子 » 用python写一个简易的字符串替换工具