Программа-скрипт для замены части текста во всех файлах каталога

Программа "Replacer" предназначена для замены части текста во всех файлах выбранного каталога. Например, вам надо во множество html-файлов вставить блок кода в определенное место, заменить один на другой или удалить. 

Скрипт написан на Python 3, имеет GUI, написанное на tkinter. Программа позволяет заменять текст либо в файлах только указанного каталога, либо в указанном и всех вложенных в него каталогах.

Программа Replacer для замены текста во всех файлах каталога
#!/usr/bin/env python3

from tkinter import *
from tkinter import filedialog as fd
import os

folder = ""


def replace_text():
    t_old = text_old.get(1.0, END)
    t_old = t_old[:-1]  # del '\n' at the end; generated by textfield
    t_new = text_new.get(1.0, END)
    t_new = t_new[:-1]
    files = []
    if r_var.get() == 0:
        for i in os.walk(folder):
            if i[-1]:  # list of files is not empty
                for j in i[-1]:
                    files.append(os.path.join(i[0], j))
            break  # because need only first tuple
    elif r_var.get() == 1:
        f = []  # list of tuples
        for i in os.walk(folder):
            f.append(i)
        for i in f:
            if i[-1]:
                for j in i[-1]:
                    files.append(os.path.join(i[0], j))
    if files:
        for i in files:
            f = open(i)
            text = f.read()
            f.close()
            text = text.replace(t_old, t_new)
            f = open(i, 'w')
            f.write(text)
            f.close()


def get_dir():
    global folder
    folder = fd.askdirectory()
    folder_label["text"] = folder
    if folder:
        replace_button["state"] = NORMAL
    else:
        replace_button["state"] = DISABLED


def select_all2(event):
    root.after(10, select_all, event.widget)


def select_all(widget):
    widget.tag_add("sel", "1.0", "end")


root = Tk()
root.title("Replacer")

Label(text="Old text:").pack(anchor=W, padx=10)
text_old = Text(width=50, height=5, wrap=WORD)
text_old.pack()
Label(text="New text:").pack(anchor=W, padx=10)
text_new = Text(width=50, height=5, wrap=WORD)
text_new.pack()
folder_label = Label(width=50, bg="lightblue")
folder_label.pack(padx=10, pady=10)
frame = Frame()
frame.pack()
frame_button = Frame(frame)
frame_button.pack(side=LEFT, padx=10)
folder_button = Button(frame_button, text="Folder", width=15, command=get_dir)
replace_button = Button(frame_button, text="Replace", width=15, state=DISABLED, command=replace_text)
folder_button.pack(anchor=W)
replace_button.pack(anchor=W, pady=10)
frame_radio = Frame(frame)
frame_radio.pack(side=LEFT, padx=10)
r_var = BooleanVar()
r_var.set(0)
r1 = Radiobutton(frame_radio, text='Only selected directory', variable=r_var, value=0)
r2 = Radiobutton(frame_radio, text='Selected and nested', variable=r_var, value=1)
r1.pack(anchor=W)
r2.pack(anchor=W)

text_old.bind('<Control-a>', select_all2)
text_new.bind('<Control-a>', select_all2)

root.mainloop()


 

Загрузить

Создано