日记首页
|
列表
|
添加日记
|
管理登陆
标题:Python生成指定后缀的文件-程序
<div style=""><font face="Arial"><span style="font-size: 14px;">Python生成指定后缀的文件-程序</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;">最终版代码:</span></font></div><div style=""><hr></div><div style=""><font face="Arial"><span style="font-size: 14px;">import os</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;">import tkinter as tk</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;">from tkinter import ttk, messagebox</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"><br></span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;">def select_parameters():</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> global confirmed, suffix, prefix, num_files</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> confirmed = False # 初始化确认状态</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"><br></span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> def on_entry_focus_in(event):</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> if entry_prefix.get() == placeholder_text:</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> entry_prefix.delete(0, tk.END)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> entry_prefix.configure(style='TEntry')</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> </span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> def on_entry_focus_out(event):</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> if not entry_prefix.get():</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> entry_prefix.insert(0, placeholder_text)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> entry_prefix.configure(style='Placeholder.TEntry')</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> </span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> def validate_inputs():</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> """验证所有输入是否有效"""</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 验证集数输入</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> try:</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> num = int(entry_num.get())</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> if not (1 <= num <= 99):</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> raise ValueError</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> except ValueError:</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> messagebox.showerror("错误", "请输入1-99之间的有效整数")</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> return False</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> </span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 验证节目名称输入</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> raw_prefix = entry_prefix.get()</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> if raw_prefix.strip() == "" or raw_prefix == placeholder_text:</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> messagebox.showerror("错误", "请输入有效的节目名称")</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> return False</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> </span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> return True</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> </span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> def on_confirm():</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> """确认按钮处理函数"""</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> global confirmed, suffix, prefix, num_files</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> </span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> if not validate_inputs():</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> return # 输入验证失败时不执行后续操作</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> </span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 获取有效输入值</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> num_files = int(entry_num.get())</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> raw_prefix = entry_prefix.get().strip()</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> </span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 处理非法字符(新增代码)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> invalid_chars = r'\/:*?"<>|' # Windows系统非法字符</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> processed_prefix = raw_prefix.rstrip('.E') # 去除尾部.E</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> processed_prefix = ''.join([c for c in processed_prefix if c not in invalid_chars]) # 过滤非法字符</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> </span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 确保处理后名称有效(新增验证)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> if not processed_prefix:</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> messagebox.showerror("错误", "名称包含过多非法字符,请输入有效名称")</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> return</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> </span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> prefix = processed_prefix # 更新全局变量</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> suffix = ext_var.get()</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> </span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> confirmed = True</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> root.quit()</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> root.destroy()</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> </span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> def on_exit():</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> """退出按钮处理函数"""</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> global confirmed</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> confirmed = False</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> root.quit()</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> root.destroy()</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> </span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 创建主窗口</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> root = tk.Tk()</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> root.title("文件生成设置")</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> root.geometry("420x220")</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> root.resizable(False, False)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"><br></span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 样式配置</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> style = ttk.Style()</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> style.configure('Placeholder.TEntry', foreground='gray')</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> </span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 主容器</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> frame = ttk.Frame(root, padding=12)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> frame.pack(expand=True, fill='both')</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"><br></span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 文件名前缀输入组件</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> placeholder_text = "请输入文件名称"</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> ttk.Label(frame, text="节目名称:", font=('微软雅黑', 9)).grid(row=0, column=0, sticky='w', pady=3)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> entry_prefix = ttk.Entry(frame, width=28, style='Placeholder.TEntry')</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> entry_prefix.insert(0, placeholder_text)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> entry_prefix.grid(row=0, column=1, columnspan=2, sticky='ew', padx=5)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> entry_prefix.bind('<FocusIn>', on_entry_focus_in)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> entry_prefix.bind('<FocusOut>', on_entry_focus_out)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> </span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 示例提示</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> ttk.Label(frame, text="示例:输入'HH' → 生成 HH.E01.mkv", </span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> foreground="gray", font=('微软雅黑', 8)).grid(row=1, column=1, sticky='w')</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"><br></span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 集数输入组件</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> ttk.Label(frame, text="生成集数:", font=('微软雅黑', 9)).grid(row=2, column=0, sticky='w', pady=3)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> entry_num = ttk.Entry(frame, width=8)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> entry_num.insert(0, '10')</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> entry_num.grid(row=2, column=1, sticky='w', padx=5)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> ttk.Label(frame, text="集(1-99)", font=('微软雅黑', 9)).grid(row=2, column=2, sticky='w')</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"><br></span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 文件格式选择组件</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> ttk.Label(frame, text="视频格式:", font=('微软雅黑', 9)).grid(row=3, column=0, sticky='w', pady=10)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> ext_var = tk.StringVar(value='.mp4')</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> btn_frame = ttk.Frame(frame)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> btn_frame.grid(row=3, column=1, columnspan=2, sticky='w')</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> ttk.Radiobutton(btn_frame, text="MP4", variable=ext_var, value='.mp4').pack(side='left', padx=6)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> ttk.Radiobutton(btn_frame, text="MKV", variable=ext_var, value='.mkv').pack(side='left', padx=6)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"><br></span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 操作按钮容器</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> btn_container = ttk.Frame(frame)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> btn_container.grid(row=4, column=0, columnspan=3, pady=12, sticky='e')</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> </span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 退出按钮</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> ttk.Button(btn_container, text="退出程序", command=on_exit, width=10).pack(side='right', padx=5)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 生成按钮</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> ttk.Button(btn_container, text="立即生成", command=on_confirm, width=10).pack(side='right')</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"><br></span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> root.mainloop()</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"><br></span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"># 初始化全局变量</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;">confirmed = False</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;">suffix = '.mkv'</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;">prefix = '未命名节目'</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;">num_files = 1</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"><br></span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"># 运行参数设置界面</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;">select_parameters()</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"><br></span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"># 根据用户选择执行操作</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;">if confirmed:</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 创建目标文件夹(路径已修改)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> folder = f"D:/电视剧/{prefix}(2025-1)" # 动态生成路径,新增固定后缀</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> os.makedirs(folder, exist_ok=True)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"><br></span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 批量创建文件</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> created_count = 0</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> for i in range(1, num_files + 1):</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> try:</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> filename = f"{prefix}.E{i:02d}{suffix}"</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> filepath = os.path.join(folder, filename)</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> with open(filepath, 'w') as file:</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> created_count += 1</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> except Exception as e:</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> print(f"⚠️ 创建文件 {filename} 失败: {str(e)}")</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"><br></span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> # 输出结果报告</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> print(f"🎉 成功创建 {created_count} 个视频文件!\n"</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> f"📁 保存路径:{os.path.abspath(folder)}\n"</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> f"📄 命名格式:{prefix}.E01{suffix}")</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;">else:</span></font></div><div style=""><font face="Arial"><span style="font-size: 14px;"> print("操作已取消,未生成任何文件。")</span></font></div><div style="font-family: Arial; font-size: 10.5pt;"><hr><br></div><div style="font-family: Arial; font-size: 10.5pt;">END</div>