You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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模块能够正确识别带引号包裹的路径(拖拽带空格的文件时,系统会自动用引号将路径包裹),将每个路径视为完整的单个元素。

修改步骤

  1. 新增导入shlex模块
  2. 替换路径拆分逻辑

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:53:17