importtkinterastkfromtkinterimportfiledialog,messagebox,ttkimportosclassTxtBatchSplitter:def__init__(self,root):self.root=root self.root.title("TXT文件批量分割工具")self.root.geometry("650x600")# 设置窗口大小# 核心变量self.source_file_path=tk.StringVar()# 源TXT文件路径self.output_dir=tk.StringVar()# 输出目录路径self.split_count=tk.IntVar(value=15)# 预设分割数量为15self.title_prefix=tk.StringVar(value="")# 标题前缀# 创建界面控件self.create_widgets()defcreate_widgets(self):# 1. 源文件选择区域frame1=ttk.LabelFrame(self.root,text="源文件设置",padding=10)frame1.pack(fill="x",padx=20,pady=10)ttk.Label(frame1,text="源TXT文件:").grid(row=0,column=0,sticky="w",padx=5,pady=5)ttk.Entry(frame1,textvariable=self.source_file_path,width=50,state="readonly").grid(row=0,column=1,padx=5,pady=5)ttk.Button(frame1,text="选择文件",command=self.select_source_file).grid(row=0,column=2,padx=5,pady=5)# 2. 分割参数设置区域frame2=ttk.LabelFrame(self.root,text="分割参数设置",padding=10)frame2.pack(fill="x",padx=20,pady=10)# 分割数量ttk.Label(frame2,text="分割数量:").grid(row=0,column=0,sticky="w",padx=5,pady=5)spin_box=ttk.Spinbox(frame2,from_=1,to=100,textvariable=self.split_count,width=10)spin_box.grid(row=0,column=1,padx=5,pady=5)ttk.Label(frame2,text="(默认预设15个文件)").grid(row=0,column=2,sticky="w",padx=5,pady=5)# 标题前缀ttk.Label(frame2,text="文件标题前缀:").grid(row=1,column=0,sticky="w",padx=5,pady=5)ttk.Entry(frame2,textvariable=self.title_prefix,width=20).grid(row=1,column=1,padx=5,pady=5)# 3. 输出目录选择区域frame3=ttk.LabelFrame(self.root,text="输出设置",padding=10)frame3.pack(fill="x",padx=20,pady=10)ttk.Label(frame3,text="输出目录:").grid(row=0,column=0,sticky="w",padx=5,pady=5)ttk.Entry(frame3,textvariable=self.output_dir,width=50,state="readonly").grid(row=0,column=1,padx=5,pady=5)ttk.Button(frame3,text="选择目录",command=self.select_output_dir).grid(row=0,column=2,padx=5,pady=5)# 4. 执行按钮区域frame4=ttk.Frame(self.root,padding=10)frame4.pack(fill="x",padx=20,pady=20)self.split_btn=ttk.Button(frame4,text="开始批量分割",command=self.start_split,width=20)# 修正后的居中方式self.split_btn.pack(padx=10,pady=5)# 5. 进度提示标签self.progress_label=ttk.Label(self.root,text="状态:等待执行",foreground="gray")self.progress_label.pack(pady=10)defselect_source_file(self):"""选择源TXT文件"""file_path=filedialog.askopenfilename(title="选择要分割的TXT文件",filetypes=[("文本文档","*.txt"),("所有文件","*.*")])iffile_path:self.source_file_path.set(file_path)self.progress_label.config(text=f"状态:已选择源文件:{os.path.basename(file_path)}",foreground="blue")defselect_output_dir(self):"""选择输出目录"""dir_path=filedialog.askdirectory(title="选择输出目录")ifdir_path:self.output_dir.set(dir_path)self.progress_label.config(text=f"状态:已选择输出目录:{dir_path}",foreground="blue")defread_source_file(self):"""读取源文件内容"""try:withopen(self.source_file_path.get(),"r",encoding="utf-8")asf:content=f.read()returncontentexceptExceptionase:messagebox.showerror("错误",f"读取源文件失败:{str(e)}")returnNonedefsplit_content(self,content):"""按分割数量均分内容(若无法均分,最后一个文件包含剩余内容)"""split_num=self.split_count.get()content_length=len(content)# 计算每个文件的基础长度base_length=content_length//split_num split_contents=[]foriinrange(split_num):start_idx=i*base_length# 最后一个文件取到末尾ifi==split_num-1:end_idx=content_lengthelse:end_idx=(i+1)*base_length sub_content=content[start_idx:end_idx]split_contents.append(sub_content)returnsplit_contentsdefgenerate_split_files(self,split_contents):"""生成分割后的TXT文件(包含对应标题、Java代码块标记和内容)"""output_dir=self.output_dir.get()title_prefix=self.title_prefix.get()split_num=self.split_count.get()source_filename=os.path.splitext(os.path.basename(self.source_file_path.get()))[0]try:foridx,sub_contentinenumerate(split_contents,1):# 构造每个分割文件的标题和文件名file_title=f"{title_prefix}{idx}(总第{idx}/{split_num}个)"# 构造输出文件名output_filename=f"{source_filename}{idx}.txt"output_filepath=os.path.join(output_dir,output_filename)# 写入文件(标题 + Java代码块开始 + 内容 + Java代码块结束 + 空行)withopen(output_filepath,"w",encoding="utf-8")asf:# 写入标题f.write(f"======{file_title}======\n")# 标题后添加```java\n(Java代码块开始标记)f.write("```java\n")f.write("\n")# 空行分隔标题标记和内容# 写入分割后的子内容f.write(sub_content)# 内容末尾添加```\n\n\n(Java代码块结束标记 + 3个换行符)f.write("\n```\n\n\n")self.progress_label.config(text=f"状态:正在生成第{idx}/{split_num}个文件...",foreground="orange")self.root.update_idletasks()# 刷新界面messagebox.showinfo("成功",f"已成功将文件分割为{split_num}个TXT文件!\n输出目录:{output_dir}")self.progress_label.config(text=f"状态:分割完成!共生成{split_num}个文件",foreground="green")exceptExceptionase:messagebox.showerror("错误",f"生成文件失败:{str(e)}")self.progress_label.config(text="状态:分割失败",foreground="red")defstart_split(self):"""执行分割主流程"""# 校验参数ifnotself.source_file_path.get():messagebox.warning("提示","请先选择要分割的源TXT文件!")returnifnotself.output_dir.get():messagebox.warning("提示","请先选择输出目录!")returnifself.split_count.get()<1:messagebox.warning("提示","分割数量不能小于1!")return# 读取源文件self.progress_label.config(text="状态:正在读取源文件...",foreground="orange")self.root.update_idletasks()content=self.read_source_file()ifnotcontent:return# 分割内容self.progress_label.config(text="状态:正在分割内容...",foreground="orange")self.root.update_idletasks()split_contents=self.split_content(content)# 生成文件self.progress_label.config(text="状态:正在生成分割文件...",foreground="orange")self.root.update_idletasks()self.generate_split_files(split_contents)if__name__=="__main__":root=tk.Tk()app=TxtBatchSplitter(root)root.mainloop()python语言TXT文件批量分割工具软件代码QZQ
张小明
前端开发工程师
8GB显卡轻松部署:Qwen3-VL-4B多模态AI终极指南
还在为多模态AI的高门槛发愁吗?传统方案动辄数十万投入,云端服务如同无底洞,开源模型性能与成本难以兼得?阿里通义千问推出的Qwen3-VL-4B-Instruct-FP8模型,以40亿参数实现"单卡部署工业级精度"的完美平衡&a…
PyCharm激活码永久解决方案?不如试试AI语音开发新路径
PyCharm激活码永久解决方案?不如试试AI语音开发新路径 在智能客服、有声书生成和虚拟主播日益普及的今天,开发者们正面临一个现实问题:如何快速验证一段“像真人”的合成语音是否可行?过去,这可能需要搭建复杂的深度学…
5分钟搞定rEFInd主题美化:从单调到惊艳的启动界面
5分钟搞定rEFInd主题美化:从单调到惊艳的启动界面 【免费下载链接】refind-theme-regular 项目地址: https://gitcode.com/gh_mirrors/ref/refind-theme-regular 厌倦了rEFInd默认的单调启动界面?想要一个既美观又实用的引导菜单?这个…
Arduino图形库终极指南:嵌入式显示开发的完整教程
Arduino图形库终极指南:嵌入式显示开发的完整教程 【免费下载链接】Arduino_GFX Arduino GFX developing for various color displays and various data bus interfaces 项目地址: https://gitcode.com/gh_mirrors/ar/Arduino_GFX 在微控制器开发中ÿ…
FirebaseUI配置管理实战:构建安全高效的移动认证系统
FirebaseUI配置管理实战:构建安全高效的移动认证系统 【免费下载链接】FirebaseUI-Android Optimized UI components for Firebase 项目地址: https://gitcode.com/gh_mirrors/fi/FirebaseUI-Android 在移动应用开发中,FirebaseUI配置管理是确保用…
PID参数调试太繁琐?VoxCPM-1.5-TTS-WEB-UI帮你语音播报调节建议
PID参数调试太繁琐?VoxCPM-1.5-TTS-WEB-UI帮你语音播报调节建议 在电机嗡鸣声中反复调整旋钮,眼睛紧盯着示波器上的波形曲线,耳边是同事念着“再加一点Kp……不对,超调了!”——这几乎是每个控制工程师都经历过的经典场…