前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用python写一个简易的字符串替换工具

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

作者头像
MinChess
发布2024-11-13 09:33:19
300
发布2024-11-13 09:33:19
举报
文章被收录于专栏:九陌斋

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

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

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

replace方法

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

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

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

方法的语法如下:

代码语言:javascript
复制
str.replace(old, new[, count])

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

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

代码语言:javascript
复制
# 替换所有匹配项
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程序

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

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

代码语言:javascript
复制
# 导入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
image-20241108154214196

使用Fastapi写一个在线的程序

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

代码语言:javascript
复制
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
image-20241108154709796

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

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

代码语言:javascript
复制
<!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>

<script>
    $(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 = "updated_file.md"; // 自定义文件名
                    document.body.appendChild(a);
                    a.click();
                    a.remove();
                    URL.revokeObjectURL(downloadUrl);
                },
                error: function (xhr, status, error) {
                    alert("替换失败: " + xhr.responseText || error);
                }
            });
        });
    });
</script>

<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

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

image-20241108154853580
image-20241108154853580

总结

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

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

image-20241108155412556
image-20241108155412556
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • replace方法
  • 使用tkinter写一个gui程序
  • 使用Fastapi写一个在线的程序
  • 总结
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档