Python中拖拽导入含空格文件路径的处理方法问询
解决拖拽含空格PDF路径被拆分的问题
问题根源
原代码使用split()方法拆分拖拽的文件路径,该方法会将所有空白字符作为分隔符,导致带空格的路径被错误拆分为多个元素。比如路径C:/Users/user123/Desktop/hash/pdf/02. pdf_file.pdf会被拆成['C:/Users/user123/Desktop/hash/pdf/02.', 'pdf_file.pdf']。
修复方案
使用shlex.split()替代原生split(),shlex模块能够正确识别带引号包裹的路径(拖拽带空格的文件时,系统会自动用引号将路径包裹),将每个路径视为完整的单个元素。
修改步骤
- 新增导入
shlex模块 - 替换路径拆分逻辑
修改后的完整代码
import os import tkinter as tk import tkinterdnd2 as tkdnd from PyPDF4 import PdfFileReader, PdfFileWriter import sys import shlex # 新增导入shlex模块 root = tkdnd.Tk() root.geometry("400x150") root.title("PDF Merger") root.wm_attributes("-topmost", True) root.resizable(False, False) root.drop_target_register(tkdnd.DND_FILES) sys.setrecursionlimit(10000) def on_drop(event): try: # 移除首尾大括号后,用shlex.split正确解析带空格的路径 raw_paths = event.data.strip("{}") file_paths = shlex.split(raw_paths) print(file_paths) file_paths.sort() folder_path = os.path.dirname(file_paths[0]) pdf_merger = PdfFileWriter() for file_path in file_paths: # 用with语句自动管理文件资源,避免重复打开 with open(file_path, "rb") as pdf_file: input_pdf = PdfFileReader(pdf_file) page_count = input_pdf.getNumPages() # 添加当前PDF的所有页面 for page_num in range(page_count): pdf_merger.addPage(input_pdf.getPage(page_num)) # 页面数为奇数时添加空白页 if page_count % 2 != 0: blank_pdf_path = os.path.join(os.path.dirname(__file__), 'blank.pdf') with open(blank_pdf_path, 'rb') as blank_file: blank_page = PdfFileReader(blank_file) pdf_merger.addPage(blank_page.getPage(0)) # 保存合并后的PDF output_path = os.path.join(folder_path, "MERGED-PDF.pdf") with open(output_path, 'wb') as output_file: pdf_merger.write(output_file) # 操作成功提示 input_box.delete(0, tk.END) input_box.insert(tk.END, f"成功合并{len(file_paths)}个PDF!") except Exception as e: input_box.delete(0, tk.END) input_box.insert(tk.END, "Error: " + str(e)) root.dnd_bind("<<Drop>>", on_drop) label = tk.Label(root, text="拖拽PDF文件到此处合并:") label.pack() input_box = tk.Entry(root, width=50, justify="center") input_box.pack() root.mainloop()
额外优化点
- 使用
with语句管理文件IO,自动关闭文件,避免资源泄漏 - 移除了未使用的
PdfFileMerger导入 - 添加了合并成功的提示信息
- 简化了循环逻辑,直接遍历
file_paths而非用索引
内容的提问来源于stack exchange,提问作者Umut Ataman BeeX
相关产品推荐
相关产品推荐

