批量替换文本文件

查看 53|回复 3
作者:宝宝丷   
  这段代码是一款面向用户的图形界面工具,旨在实现文本文件中字符串的批量替换功能。通过此工具,用户能够高效地处理大量文本文件,实现内容的一致性修改。
  具体功能概述如下:
  目录选择机制:
  用户可通过界面提供的“选择目录”功能按钮,指定包含待处理文本文件的目录路径。
  字符串输入设定:
  用户需在“旧字符串”及“新字符串”对应的输入框中,分别输入待替换的原始字符串以及替换后的新字符串。
  正则表达式支持:
  工具提供正则表达式匹配选项,用户可通过下拉选择框设定是否启用该功能,以增强字符串匹配的灵活性和准确性。
  备份文件创建选项:
  为确保数据安全,工具支持在替换操作前创建文件备份。用户可通过勾选“创建备份”复选框来启用该功能。
  日志信息与进度展示:
  界面设计包含日志显示区域及进度条,用于实时展示每个文件的处理状态(成功或失败),以及当前处理的文件数量与总文件数量的对比信息。
  替换操作启动:
  当用户完成上述设定后,可点击“开始替换”按钮启动批量替换操作。程序将自动遍历选定目录下的所有.txt文件,并执行字符串替换任务。
  错误处理与信息提示:
  工具内置完善的错误处理机制,若用户未选择目录或未输入必要的字符串信息,程序将弹出相应的错误提示信息。待所有文件处理完毕后,工具将自动弹出提示信息,告知用户处理任务已完成。
  综上所述,此工具以其高效、稳定的性能,为用户提供了便捷、可靠的文本文件批量替换解决方案,尤其适用于需要对大量文本文件进行统一修改的场景。


微信截图_20240529165214.png (42.66 KB, 下载次数: 0)
下载附件
2024-5-29 16:52 上传

[Python] 纯文本查看 复制代码import re
import os
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
from tkinter.scrolledtext import ScrolledText
class BatchReplaceApp:
    def __init__(self, root):
        self.root = root
        self.root.title("批量替换工具")
        self.root.geometry("900x800")
        self.root.configure(bg='#F0F0F0')
        self.style = ttk.Style()
        self.style.configure('TButton', font=('Segoe UI', 10), padding=6)
        self.style.configure('TEntry', font=('Segoe UI', 10))
        self.style.configure('TLabel', font=('Segoe UI', 10), background='#F0F0F0')
        self.style.configure('TCheckbutton', font=('Segoe UI', 10), background='#F0F0F0')
        self.create_widgets()
    def create_widgets(self):
        frame = ttk.Frame(self.root, padding="10 10 10 10")
        frame.pack(fill=tk.BOTH, expand=True)
        # Configure grid weights for responsiveness
        frame.grid_rowconfigure(5, weight=1)
        frame.grid_columnconfigure(1, weight=1)
        self.directory_label = ttk.Label(frame, text="目录:")
        self.directory_label.grid(row=0, column=0, sticky=tk.W, pady=(20, 5))
        self.directory_entry = ttk.Entry(frame, width=50)
        self.directory_entry.grid(row=0, column=1, pady=(20, 5), padx=(0, 10), sticky=tk.EW)
        self.select_directory_button = ttk.Button(frame, text="选择目录", command=self.select_directory)
        self.select_directory_button.grid(row=0, column=2, pady=(20, 5))
        self.old_str_label = ttk.Label(frame, text="旧字符串:")
        self.old_str_label.grid(row=1, column=0, sticky=tk.W, pady=5)
        self.old_str_entry = ttk.Entry(frame, width=50)
        self.old_str_entry.grid(row=1, column=1, pady=5, padx=(0, 10), sticky=tk.EW)
        self.new_str_label = ttk.Label(frame, text="新字符串:")
        self.new_str_label.grid(row=2, column=0, sticky=tk.W, pady=5)
        self.new_str_entry = ttk.Entry(frame, width=50)
        self.new_str_entry.grid(row=2, column=1, pady=5, padx=(0, 10), sticky=tk.EW)
        self.regex_label = ttk.Label(frame, text="使用正则表达式:")
        self.regex_label.grid(row=3, column=0, sticky=tk.W, pady=5)
        self.use_regex_var = tk.StringVar()
        self.use_regex_combobox = ttk.Combobox(frame, textvariable=self.use_regex_var, state="readonly", values=["是", "否"])
        self.use_regex_combobox.current(1)
        self.use_regex_combobox.grid(row=3, column=1, pady=5, padx=(0, 10), sticky=tk.W)
        self.create_backup_var = tk.BooleanVar(value=True)
        self.create_backup_checkbox = ttk.Checkbutton(frame, text="创建备份", variable=self.create_backup_var)
        self.create_backup_checkbox.grid(row=4, column=0, sticky=tk.W, pady=5)
        self.log_text = ScrolledText(frame, height=10, width=70, wrap=tk.WORD, font=('Segoe UI', 10))
        self.log_text.grid(row=5, column=0, columnspan=3, pady=5, padx=(0, 10), sticky=tk.NSEW)
        self.progress_bar = ttk.Progressbar(frame, orient="horizontal", length=400, mode="determinate")
        self.progress_bar.grid(row=6, column=0, columnspan=3, pady=20, sticky=tk.EW)
        self.progress_label = ttk.Label(frame, text="")
        self.progress_label.grid(row=7, column=0, columnspan=3, pady=5)
        self.start_button = ttk.Button(frame, text="开始替换", command=self.start_replacing)
        self.start_button.grid(row=8, column=0, columnspan=3, pady=20)
    def select_directory(self):
        directory = filedialog.askdirectory()
        if directory:
            self.directory_entry.delete(0, tk.END)
            self.directory_entry.insert(0, directory)
    def start_replacing(self):
        directory = self.directory_entry.get()
        old_str = self.old_str_entry.get()
        new_str = self.new_str_entry.get()
        use_regex = self.use_regex_var.get() == "是"
        create_backup = self.create_backup_var.get()
        if not directory:
            messagebox.showwarning("错误", "请选择一个目录.")
            return
        if not old_str:
            messagebox.showwarning("错误", "请输入旧字符串.")
            return
        if not new_str:
            messagebox.showwarning("错误", "请输入新字符串.")
            return
        self.log_text.delete(1.0, tk.END)
        self.progress_bar["value"] = 0
        files_to_replace = []
        for root, dirs, files in os.walk(directory):
            for file in files:
                if file.endswith('.txt'):
                    files_to_replace.append(os.path.join(root, file))
        if not files_to_replace:
            messagebox.showinfo("信息", "没有找到任何.txt文件。")
            return
        self.progress_bar["maximum"] = len(files_to_replace)
        for index, file_path in enumerate(files_to_replace):
            self.replace_in_file(file_path, old_str, new_str, use_regex, create_backup)
            self.progress_bar["value"] = index + 1
            self.progress_label.config(text=f"进度: {index + 1}/{len(files_to_replace)}")
            self.root.update_idletasks()
        messagebox.showinfo("完成", "所有文件处理完毕!")
    def replace_in_file(self, file_path, old_str, new_str, use_regex, create_backup):
        try:
            with open(file_path, 'r', encoding='utf-8') as file:
                content = file.read()
            if use_regex:
                new_content = re.sub(old_str, new_str, content, flags=re.MULTILINE)
            else:
                new_content = content.replace(old_str, new_str)
            if create_backup:
                backup_file_path = file_path + '.bak'
                with open(backup_file_path, 'w', encoding='utf-8') as backup_file:
                    backup_file.write(content)
            with open(file_path, 'w', encoding='utf-8') as file:
                file.write(new_content)
            self.log_text.insert(tk.END, f"成功替换: {file_path}\n")
        except Exception as e:
            self.log_text.insert(tk.END, f"替换失败: {file_path} - {str(e)}\n")
if __name__ == "__main__":
    root = tk.Tk()
    app = BatchReplaceApp(root)
    root.mainloop()

字符串, 用户

宝宝丷
OP
  

感觉很乱 ,不太会排版
奈酱   

可以字与字之间批量加空格
lvtaode0657   

很不错哦。辛苦了
您需要登录后才可以回帖 登录 | 立即注册

返回顶部