某坛友@排排坐 发的一个帖子【[资源求助] 求TXT文件按条件批量删除行工具】,用Python顺手写了个小工具,现在开源出来,有需要的可以自己修改代码自取。
功能:
- 批量删除行含关键字或词的行(多个关键字/词中间用空格隔开)
- 批量删除空行
- 批量字符小于多少(可设定)删除行
- 批量删除匹配正则的行
使用方法:
- 点击打开文件批量选择TXT文件(可以直接拖拽)。
- 需要的功能前打勾,并配置。
- 点击【开始 】即可进行转换。
- 最后会生成原文件名+_new.txt的文件。
2021.08.02 更新:@排排坐 @waltzofjack
- 批量删除匹配正则的行(方便自定义匹配规则)
- 允许文件拖拽到界面
- 执行报错会产生log文件
- 其他细节变化
使用截图:
GIF图片很大,你忍一下。。。
动图地址:GIF地址
打包好的单EXE文件地址(双击即可运行 ):https://wwx.lanzoui.com/iWGXVs4szsd
源码(个把小时写的,质量一般,但是功能很全 ):
[Python] 纯文本查看 复制代码
import os
import re
import time
from tkinter import ttk, filedialog, messagebox, INSERT, Tk, Button, Text, Scrollbar, \
HORIZONTAL, VERTICAL, IntVar, Checkbutton, Label, StringVar, Entry # 有Combobox、LabelFrame 组件时需要本语句
import windnd
ui_pos = {
"title": "TxT文件处理助手V0.2-0802 By 52poje Loker",
"geometry": "450x300", # 长乘宽
}
FilePaths = ()
def clearAll():
ctrl_FileListBox.delete(1.0, "end") # 清空文件路径
str_KeyWord.set("")
str_KeyNum.set("")
def getTxtFiles():
global FilePaths
files = filedialog.askopenfilenames(filetypes=[('text files', '.txt')])
if files:
FilePaths = files
for f_name in files:
ctrl_FileListBox.insert('end', f_name)
ctrl_FileListBox.insert(INSERT, '\n')
else:
messagebox.showinfo(title='提示', message='没有选择任何文件!')
def KeyWordScan(keys, s):
key_words = keys.split(" ")
t_f = False
for key_word in key_words:
if key_word in s:
t_f = True
return t_f
def ctrl_StartBtn_clicked():
has_key_words = int_CheckBox1.get()
key_words = str_KeyWord.get()
has_empty_line = int_CheckBox2.get()
has_N = int_CheckBox3.get()
n = str_KeyNum.get()
has_zz = int_CheckBox4.get()
zz = str_zz.get()
try:
for file in FilePaths: # 循环遍历文件
s_file = open(os.path.splitext(file)[0] + "_new" + os.path.splitext(file)[1], 'w+') # 文件保存位置
f_lines = open(file, encoding='utf8').readlines() # 打开文件,读入每一行
for s in f_lines: # s: 每一行的内容
# 操作1
if has_key_words:
if KeyWordScan(key_words, s):
continue
# 操作2
if has_empty_line:
if len(s.strip()) == 0:
continue
# 操作3:
if has_N:
if len(s.strip()) < int(n):
continue
if has_zz:
if re.match(zz, s.strip()):
continue
s_file.write(s)
s_file.close() # 关闭文件
except Exception as e:
with open("log", "a+") as f:
f.write(time.strftime("%Y-%m-%d, %H:%M:%S", time.localtime()) + "\n")
f.write(repr(e) + "\n")
def draggedFiles(files):
msg = '\n'.join((item.decode('gbk') for item in files))
for f_name in files:
ctrl_FileListBox.insert('end', f_name)
ctrl_FileListBox.insert(INSERT, '\n')
print(msg)
root = Tk() # 设定窗体变量
root.geometry(ui_pos["geometry"]) # 格式('宽x高+x+y')其中x、y为位置
root.title(ui_pos["title"])
windnd.hook_dropfiles(root, func=draggedFiles)
ctrl_Frame1 = ttk.LabelFrame(root, text='选项')
ctrl_Frame1.place(x=14, y=72, width=388, height=140)
ctrl_StartBtn = Button(root, text='执行', font=('宋体', '9'),
command=ctrl_StartBtn_clicked) # 可在括号内加上调用函数部分 ,command=ctrl_StartBtn_clicked
ctrl_StartBtn.place(x=22, y=250, width=72, height=29)
ctrl_QuitBtn = Button(root, text='清除', font=('宋体', '9'), command=clearAll) # 可在括号内加上调用函数部分 ,command=ctrl_QuitBtn_clicked
ctrl_QuitBtn.place(x=108, y=250, width=72, height=29)
ctrl_FileListBox = Text(root, font=('宋体', '9'))
ctrl_FileListBox.place(x=14, y=7, width=260, height=38)
ctrl_Scrollbar1 = Scrollbar(root, command=ctrl_FileListBox.xview, orient=HORIZONTAL)
ctrl_Scrollbar1.place(x=14, y=46, width=261, height=16)
ctrl_Scrollbar2 = Scrollbar(root, command=ctrl_FileListBox.yview, orient=VERTICAL)
ctrl_Scrollbar2.place(x=275, y=7, width=16, height=39)
ctrl_FileListBox.config(xscrollcommand=ctrl_Scrollbar1.set, yscrollcommand=ctrl_Scrollbar2.set, wrap='none')
int_CheckBox1 = IntVar() # 绑定变量
ctrl_CheckBox1 = Checkbutton(ctrl_Frame1, text='删除行含关键字或词的行', variable=int_CheckBox1, font=('宋体', '9'))
ctrl_CheckBox1.place(x=14, y=14, height=22) # 考虑到对齐问题,不列入宽度,需要时手动加入 width=130
ctrl_CheckBox1.deselect() # 默认为未选中状态
Ctrl_Label1 = Label(ctrl_Frame1, text="关键字:")
Ctrl_Label1.place(x=180, y=14, width=55, height=22)
str_KeyWord = StringVar() # 绑定变量
ctrl_KeyWord = Entry(ctrl_Frame1, textvariable=str_KeyWord, font=('宋体', '9'))
ctrl_KeyWord.place(x=230, y=14, width=150, height=22)
int_CheckBox2 = IntVar() # 绑定变量
ctrl_CheckBox2 = Checkbutton(ctrl_Frame1, text='删除空行', variable=int_CheckBox2, font=('宋体', '9'))
ctrl_CheckBox2.place(x=14, y=36, height=22) # 考虑到对齐问题,不列入宽度,需要时手动加入 width=130
ctrl_CheckBox2.deselect() # 默认为未选中状态
int_CheckBox3 = IntVar() # 绑定变量
ctrl_CheckBox3 = Checkbutton(ctrl_Frame1, text='删除字符小于N的行', variable=int_CheckBox3, font=('宋体', '9'))
ctrl_CheckBox3.place(x=14, y=58, height=22) # 考虑到对齐问题,不列入宽度,需要时手动加入 width=130
ctrl_CheckBox3.deselect() # 默认为未选中状态
# N标签
Ctrl_Label = Label(ctrl_Frame1, text="N =")
Ctrl_Label.place(x=180, y=58, width=55, height=22)
# N
str_KeyNum = StringVar() # 绑定变量
ctrl_KeyNum = Entry(ctrl_Frame1, textvariable=str_KeyNum, font=('宋体', '9'))
ctrl_KeyNum.place(x=230, y=58, width=30, height=22)
int_CheckBox4 = IntVar() # 绑定变量
ctrl_CheckBox4 = Checkbutton(ctrl_Frame1, text='删除符合正则的行', variable=int_CheckBox4, font=('宋体', '9'))
ctrl_CheckBox4.place(x=14, y=80, height=22) # 考虑到对齐问题,不列入宽度,需要时手动加入 width=130
ctrl_CheckBox4.deselect() # 默认为未选中状态
# N标签
Ctrl_Label2 = Label(ctrl_Frame1, text="正则:")
Ctrl_Label2.place(x=180, y=80, width=55, height=22)
# N
str_zz = StringVar() # 绑定变量
ctrl_zz = Entry(ctrl_Frame1, textvariable=str_zz, font=('宋体', '9'))
ctrl_zz.place(x=230, y=80, width=150, height=22)
ctrl_OpenFileBtn = Button(root, text='选择文件',
font=('宋体', '9'),
command=getTxtFiles) # 可在括号内加上调用函数部分 ,command=ctrl_OpenFileBtn_clicked
ctrl_OpenFileBtn.place(x=305, y=18, width=72, height=29)
root.mainloop()
有其他需求和想法请在本帖留言,我会尽量更新。
也欢迎其他小伙伴在开源出其他版本。