鱼C论坛

 找回密码
 立即注册
查看: 384|回复: 7

[已解决]求助做一个指定多个文件夹,对里面pdf进行汇总归并,并做好超链接

[复制链接]
发表于 2024-10-7 12:49:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求助做一个指定多个文件夹,对里面pdf进行汇总归并,并做好超链接

需求如下:
1.用tkinter指定文件夹,可以一直选,选到点停止按钮(所以界面要做个停止按钮)
2.指定一个用于存放的文件夹
3.对选中的所有文件夹里的pdf文件,也就是后缀为“.pdf”的文件,汇总复制到指定文件夹下面新建一个“PDF”的文件夹内,同样名称的只复制一个。
4.新建一个excel,第一列为名称,内容为“PDF”的文件夹内的“.pdf”的文件的名称,不含“.pdf”,第二列为超链接,链接指向“PDF”的文件夹内的“.pdf”的文件
最佳答案
2024-10-7 14:19:34
颂风侯 发表于 2024-10-07 14:19
这个界面是好看多了,但是生成失败的,都是空文件,里 ...


为了实现你的需求,我们可以用Python来完成对应的功能。下面提供一个示例代码,你可以根据需要调整和测试:

  1. import os
  2. import shutil
  3. import tkinter as tk
  4. from tkinter import filedialog
  5. import pandas as pd

  6. # 用于存放选择的文件夹路径
  7. selected_directories = []

  8. def select_folder():
  9.     # 选择文件夹
  10.     folder = filedialog.askdirectory()
  11.     if folder:
  12.         selected_directories.append(folder)
  13.         listbox.insert(tk.END, folder)

  14. def stop_selection():
  15.     # 禁用选择按钮和停止按钮
  16.     select_button.config(state=tk.DISABLED)
  17.     stop_button.config(state=tk.DISABLED)
  18.     # 呼叫处理PDF的功能
  19.     process_pdfs()

  20. def process_pdfs():
  21.     # 选择存放PDF和Excel的目录
  22.     target_directory = filedialog.askdirectory(title="选择存放PDF和Excel的目录")
  23.     if not target_directory:
  24.         return
  25.    
  26.     # 创建存储PDF的文件夹
  27.     pdf_folder = os.path.join(target_directory, "PDF")
  28.     os.makedirs(pdf_folder, exist_ok=True)

  29.     # 用于追踪已经复制的PDF文件名称
  30.     copied_files = set()

  31.     # 遍历选择的每个目录
  32.     for folder in selected_directories:
  33.         for root, dirs, files in os.walk(folder):
  34.             for file in files:
  35.                 if file.endswith('.pdf'):
  36.                     if file not in copied_files:
  37.                         # 复制文件到目标文件夹
  38.                         source_file = os.path.join(root, file)
  39.                         target_file = os.path.join(pdf_folder, file)
  40.                         shutil.copy(source_file, target_file)
  41.                         copied_files.add(file)

  42.     # 创建Excel文件
  43.     excel_data = {"名称": [], "超链接": []}
  44.     for file in copied_files:
  45.         file_name = os.path.splitext(file)[0]
  46.         file_path = os.path.join(pdf_folder, file)
  47.         excel_data["名称"].append(file_name)
  48.         excel_data["超链接"].append(f'=HYPERLINK("{file_path}", "{file}")')

  49.     # 将数据写入Excel
  50.     df = pd.DataFrame(excel_data)
  51.     excel_file_path = os.path.join(target_directory, "PDF汇总.xlsx")
  52.     df.to_excel(excel_file_path, index=False)

  53.     print("PDF汇总和Excel生成完毕!")

  54. # 创建Tkinter图形界面
  55. root = tk.Tk()
  56. root.title("PDF汇总工具")

  57. # 创建界面组件
  58. select_button = tk.Button(root, text="选择文件夹", command=select_folder)
  59. select_button.pack(pady=5)
  60. stop_button = tk.Button(root, text="停止选择", command=stop_selection)
  61. stop_button.pack(pady=5)
  62. listbox = tk.Listbox(root, width=80)
  63. listbox.pack(pady=5)

  64. # 启动Tkinter主循环
  65. root.mainloop()
复制代码


### 注意事项:
1. 确保已安装 `pandas` 和 `openpyxl` 库,因为pandas会用到它们来处理Excel文件,可以通过 `pip install pandas openpyxl` 安装。
2. 由于某些环境权限限制,选择存放Excel文件的文件夹时请确保对该目录有写权限。

这段代码使用了Tkinter来选择文件夹,并将PDF文件复制到指定位置并生成链接,确保你的PDF存放路径没有空格或非ASCII字符可能提高成功率。 你可以将其另存为 `.py` 文件来运行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-10-7 12:49:52 | 显示全部楼层
要实现你的需求,可以使用 Python 搭配 `tkinter` 来创建 GUI,`shutil` 来处理文件复制,以及 `pandas` 来生成 Excel 表格。下面是一个示例代码,可以帮助你完成这个任务:

  1. import os
  2. import shutil
  3. import tkinter as tk
  4. from tkinter import filedialog
  5. import pandas as pd

  6. class PDFCollectorApp:
  7.     def __init__(self, root):
  8.         self.root = root
  9.         self.root.title("PDF Collector")
  10.         self.pdf_paths = set()

  11.         self.select_button = tk.Button(root, text='选择文件夹', command=self.select_folders)
  12.         self.select_button.pack(pady=10)

  13.         self.stop_button = tk.Button(root, text='停止选择', command=self.stop_selection)
  14.         self.stop_button.pack(pady=10)

  15.         self.save_button = tk.Button(root, text='指定存放文件夹', command=self.set_save_folder)
  16.         self.save_button.pack(pady=10)

  17.         self.selected_folders = []
  18.         self.save_folder = None

  19.     def select_folders(self):
  20.         folder = filedialog.askdirectory(title="选择文件夹")
  21.         if folder:
  22.             self.selected_folders.append(folder)

  23.     def stop_selection(self):
  24.         self.scan_pdfs()
  25.         tk.messagebox.showinfo("提示", "选择已停止")

  26.     def set_save_folder(self):
  27.         self.save_folder = filedialog.askdirectory(title="选择用于存放文件夹")
  28.         if self.save_folder:
  29.             self.copy_pdfs()
  30.             self.create_excel()

  31.     def scan_pdfs(self):
  32.         for folder in self.selected_folders:
  33.             for root, dirs, files in os.walk(folder):
  34.                 for file in files:
  35.                     if file.endswith('.pdf'):
  36.                         self.pdf_paths.add(os.path.join(root, file))

  37.     def copy_pdfs(self):
  38.         pdf_folder = os.path.join(self.save_folder, "PDF")
  39.         os.makedirs(pdf_folder, exist_ok=True)

  40.         for pdf_path in self.pdf_paths:
  41.             pdf_name = os.path.basename(pdf_path)
  42.             dest_path = os.path.join(pdf_folder, pdf_name)
  43.             if not os.path.exists(dest_path):
  44.                 shutil.copy(pdf_path, dest_path)

  45.     def create_excel(self):
  46.         pdf_folder = os.path.join(self.save_folder, "PDF")
  47.         pdf_files = os.listdir(pdf_folder)

  48.         data = {
  49.             '名称': [os.path.splitext(pdf)[0] for pdf in pdf_files],
  50.             '超链接': [f'=HYPERLINK("{os.path.join(pdf_folder, pdf)}", "{pdf}")' for pdf in pdf_files]
  51.         }
  52.         
  53.         df = pd.DataFrame(data)
  54.         excel_path = os.path.join(self.save_folder, "PDF汇总.xlsx")
  55.         df.to_excel(excel_path, index=False)

  56. if __name__ == "__main__":
  57.     root = tk.Tk()
  58.     app = PDFCollectorApp(root)
  59.     root.mainloop()
复制代码


### 代码说明:
1. 使用 `tkinter` 创建一个简单的 GUI 界面,用于选择文件夹和设置存储位置。
2. 使用 `os.walk` 遍历所有选择的文件夹,将所有 PDF 文件路径存储在集合中以去重。
3. 使用 `shutil.copy` 将所有 PDF 文件复制到指定的存储文件夹中。
4. 使用 `pandas` 创建 Excel 文件,保存 PDF 文件的名称和对应的文件超链接。

### 准备工作:
- 确保安装 `pandas` 库,可以通过命令 `pip install pandas` 进行安装。
- 确保目标操作系统支持 GUI,并正确配置相关环境。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-7 13:05:32 | 显示全部楼层
  1. import os
  2. import shutil
  3. import tkinter as tk
  4. from tkinter import filedialog
  5. import pandas as pd

  6. class PDFCollectorApp:
  7.     def __init__(self, root):
  8.         self.root = root
  9.         self.root.title("PDF Collector")
  10.         self.pdf_paths = set()

  11.         self.select_button = tk.Button(root, text='选择文件夹', command=self.select_folders)
  12.         self.select_button.pack(pady=10)

  13.         self.stop_button = tk.Button(root, text='停止选择', command=self.stop_selection)
  14.         self.stop_button.pack(pady=10)

  15.         self.save_button = tk.Button(root, text='指定存放文件夹', command=self.set_save_folder)
  16.         self.save_button.pack(pady=10)

  17.         self.selected_folders = []
  18.         self.save_folder = None

  19.     def select_folders(self):
  20.         folder = filedialog.askdirectory(title="选择文件夹")
  21.         if folder:
  22.             self.selected_folders.append(folder)

  23.     def stop_selection(self):
  24.         self.scan_pdfs()
  25.         k.messagebox.showinfo("提示", "选择已停止")

  26.     def set_save_folder(self):
  27.         self.save_folder = filedialog.askdirectory(title="选择用于存放文件夹")
  28.         if self.save_folder:
  29.             self.copy_pdfs()
  30.             self.create_excel()

  31.     def scan_pdfs(self):
  32.         for folder in self.selected_folders:
  33.             for root, dirs, files in os.walk(folder):
  34.                 for file in files:
  35.                     if file.endswith('.pdf'):
  36.                         self.pdf_paths.add(os.path.join(root, file))

  37.     def copy_pdfs(self):
  38.         pdf_folder = os.path.join(self.save_folder, "PDF")
  39.         os.makedirs(pdf_folder, exist_ok=True)

  40.         for pdf_path in self.pdf_paths:
  41.             pdf_name = os.path.basename(pdf_path)
  42.             dest_path = os.path.join(pdf_folder, pdf_name)
  43.             if not os.path.exists(dest_path):
  44.                 shutil.copy(pdf_path, dest_path)

  45.     def create_excel(self):
  46.         pdf_folder = os.path.join(self.save_folder, "PDF")
  47.         pdf_files = os.listdir(pdf_folder)

  48.     data = {
  49.             '名称': [os.path.splitext(pdf)[0] for pdf in pdf_files],
  50.             '超链接': [f'=HYPERLINK("{os.path.join(pdf_folder, pdf)}", "{pdf}")' for pdf in pdf_folder]
  51.     }

  52.     df = pd.DataFrame(data)
  53.     excel_path = os.path.join(self.save_folder, "PDF汇总.xlsx")
  54.     df.to_excel(excel_path, index=False)

  55. if __name__ == "__main__":
  56.     root = tk.Tk()
  57.     app = PDFCollectorApp(root)
  58.     root.mainloop()
复制代码


报错如下
Traceback (most recent call last):
  File "D:\PYTHON_NEW\pack20240926\pythonProject1\PDF整理为excel目录带链接.py", line 7, in <module>
    class PDFCollectorApp:
  File "D:\PYTHON_NEW\pack20240926\pythonProject1\PDF整理为excel目录带链接.py", line 62, in PDFCollectorApp
    '名称': [os.path.splitext(pdf)[0] for pdf in pdf_files],
                                                 ^^^^^^^^^
NameError: name 'pdf_files' is not defined. Did you mean: 'pdf_folder'?

Process finished with exit code 1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-7 13:05:48 | 显示全部楼层
颂风侯 发表于 2024-10-07 13:05
import os
import shutil
import tkinter as tk
fr ...


看起来你的代码中有几个小问题导致了错误,让我们一起来修复这些错误吧:

1. **定义变量的问题**:`self.selected_folders` 变量未初始化。
2. **错位缩进**:部分代码行的缩进不正确。
3. **拼接问题**:`'名称'` 的拼接格式有误。

下面是修正后的代码:

  1. import os
  2. import shutil
  3. import tkinter as tk
  4. from tkinter import filedialog, messagebox  # 确保 messagebox 被导入
  5. import pandas as pd

  6. class PDFCollectorApp:
  7.     def __init__(self, root):
  8.         self.root = root
  9.         self.root.title("PDF Collector")
  10.         self.pdf_paths = set()

  11.         self.select_button = tk.Button(root, text='选择文件夹', command=self.select_folders)
  12.         self.select_button.pack(pady=10)

  13.         self.stop_button = tk.Button(root, text='停止选择', command=self.stop_selection)
  14.         self.stop_button.pack(pady=10)

  15.         self.save_button = tk.Button(root, text='指定存放文件夹', command=self.set_save_folder)
  16.         self.save_button.pack(pady=10)

  17.         self.selected_folders = []  # 初始化为空列表
  18.         self.save_folder = None

  19.     def select_folders(self):
  20.         folder = filedialog.askdirectory(title="选择文件夹")
  21.         if folder:
  22.             self.selected_folders.append(folder)

  23.     def stop_selection(self):
  24.         self.scan_pdfs()
  25.         messagebox.showinfo("提示", "选择已停止")  # 确保使用 tkinter 的 messagebox

  26.     def set_save_folder(self):
  27.         self.save_folder = filedialog.askdirectory(title="选择用于存放文件夹")
  28.         if self.save_folder:
  29.             self.copy_pdfs()
  30.             self.create_excel()

  31.     def scan_pdfs(self):
  32.         for folder in self.selected_folders:
  33.             for root, dirs, files in os.walk(folder):
  34.                 for file in files:
  35.                     if file.endswith('.pdf'):
  36.                         self.pdf_paths.add(os.path.join(root, file))

  37.     def copy_pdfs(self):
  38.         pdf_folder = os.path.join(self.save_folder, "PDF")
  39.         os.makedirs(pdf_folder, exist_ok=True)

  40.         for pdf_path in self.pdf_paths:
  41.             pdf_name = os.path.basename(pdf_path)
  42.             dest_path = os.path.join(pdf_folder, pdf_name)
  43.             if not os.path.exists(dest_path):
  44.                 shutil.copy(pdf_path, dest_path)

  45.     def create_excel(self):
  46.         pdf_folder = os.path.join(self.save_folder, "PDF")
  47.         pdf_files = os.listdir(pdf_folder)

  48.         data = {
  49.             '名称': [os.path.splitext(pdf)[0] for pdf in pdf_files],  # 只取文件名,不含扩展名
  50.             '超链接': [os.path.join(pdf_folder, pdf) for pdf in pdf_files]
  51.         }

  52.         df = pd.DataFrame(data)
  53.         excel_path = os.path.join(self.save_folder, "PDF汇总.xlsx")
  54.         df.to_excel(excel_path, index=False)

  55. if __name__ == "__main__":
  56.     root = tk.Tk()
  57.     app = PDFCollectorApp(root)
  58.     root.mainloop()
复制代码


### 关键修正:
- 初始化 `self.selected_folders` 为一个空列表。
- 确保拼接 `'名称'` 列时,仅提取文件名而非元组。
- 使用 `messagebox` 正确显示提示信息。
- 修正缩进以确保代码结构完整。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-7 13:24:00 | 显示全部楼层
以上程序还能再改进下呢
1.选择了存放文件夹后,在图形界面显示“正在处理中”,完成后显示“已完成”,十秒后自动关闭
2.“超链接”这一列没有实现超链接的功能,无法点一下去打开链接的pdf
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-7 13:24:13 | 显示全部楼层
颂风侯 发表于 2024-10-07 13:24
以上程序还能再改进下呢
1.选择了存放文件夹后,在图 ...


我们可以对程序进行一些改进,来满足您的需求:

1. 在选择了存放文件夹后,可以使用 `Label` 来更新界面的状态,显示“正在处理中”或“已完成”。

2. 修改 Excel 文件中的超链接列,让其具有可以点击打开 PDF 的功能。

以下是一个基本思路:

  1. import os
  2. import shutil
  3. import tkinter as tk
  4. from tkinter import filedialog, messagebox
  5. import pandas as pd

  6. # 初始化全局变量
  7. selected_folders = []

  8. def select_folder():
  9.     folder = filedialog.askdirectory()
  10.     if folder:
  11.         selected_folders.append(folder)
  12.         listbox.insert(tk.END, folder)

  13. def select_destination():
  14.     destination_folder = filedialog.askdirectory()
  15.     if not destination_folder:
  16.         return
  17.    
  18.     # 界面更新为“正在处理中”
  19.     status_label.config(text="正在处理中...")
  20.     root.update()

  21.     pdf_folder = os.path.join(destination_folder, "PDF")
  22.     os.makedirs(pdf_folder, exist_ok=True)

  23.     pdf_files = set()
  24.    
  25.     for folder in selected_folders:
  26.         for root_dir, dirs, files in os.walk(folder):
  27.             for file in files:
  28.                 if file.endswith('.pdf'):
  29.                     pdf_files.add(file)

  30.     pdf_files_copied = []
  31.     for file in pdf_files:
  32.         for folder in selected_folders:
  33.             file_path = os.path.join(folder, file)
  34.             if os.path.exists(file_path):
  35.                 shutil.copy(file_path, pdf_folder)
  36.                 pdf_files_copied.append(file)
  37.                 break

  38.     data = {
  39.         "名称": [os.path.splitext(file)[0] for file in pdf_files_copied],
  40.         "超链接": [f'=HYPERLINK("{os.path.join(pdf_folder, file)}", "{file}")' for file in pdf_files_copied]
  41.     }

  42.     df = pd.DataFrame(data)
  43.     excel_path = os.path.join(destination_folder, "PDF汇总.xlsx")
  44.     df.to_excel(excel_path, index=False)

  45.     # 界面更新为“已完成”
  46.     status_label.config(text="已完成")
  47.     root.update()

  48.     root.after(10000, root.quit)  # 10秒后关闭窗口

  49. def stop():
  50.     root.quit()

  51. root = tk.Tk()
  52. root.title("PDF 汇总工具")

  53. select_button = tk.Button(root, text="选择文件夹", command=select_folder)
  54. select_button.pack()

  55. listbox = tk.Listbox(root)
  56. listbox.pack(fill=tk.BOTH, expand=True)

  57. destination_button = tk.Button(root, text="选择存放文件夹", command=select_destination)
  58. destination_button.pack()

  59. status_label = tk.Label(root, text="")
  60. status_label.pack()

  61. stop_button = tk.Button(root, text="停止", command=stop)
  62. stop_button.pack()

  63. root.mainloop()
复制代码


### 改进说明

1. **界面状态更新**:在合并 PDF 过程中更改标签文本为“正在处理中”,完成后更改为“已完成”。

2. **Excel 超链接**:通过在 DataFrame 中的超链接列中添加 `=HYPERLINK("<路径>", "<显示文本>")` 公式来实现实际可点击的超链接。

这些改进使交互更加直观和功能更完善。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-7 14:19:23 | 显示全部楼层
这个界面是好看多了,但是生成失败的,都是空文件,里面没东西
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-7 14:19:34 | 显示全部楼层    本楼为最佳答案   
颂风侯 发表于 2024-10-07 14:19
这个界面是好看多了,但是生成失败的,都是空文件,里 ...


为了实现你的需求,我们可以用Python来完成对应的功能。下面提供一个示例代码,你可以根据需要调整和测试:

  1. import os
  2. import shutil
  3. import tkinter as tk
  4. from tkinter import filedialog
  5. import pandas as pd

  6. # 用于存放选择的文件夹路径
  7. selected_directories = []

  8. def select_folder():
  9.     # 选择文件夹
  10.     folder = filedialog.askdirectory()
  11.     if folder:
  12.         selected_directories.append(folder)
  13.         listbox.insert(tk.END, folder)

  14. def stop_selection():
  15.     # 禁用选择按钮和停止按钮
  16.     select_button.config(state=tk.DISABLED)
  17.     stop_button.config(state=tk.DISABLED)
  18.     # 呼叫处理PDF的功能
  19.     process_pdfs()

  20. def process_pdfs():
  21.     # 选择存放PDF和Excel的目录
  22.     target_directory = filedialog.askdirectory(title="选择存放PDF和Excel的目录")
  23.     if not target_directory:
  24.         return
  25.    
  26.     # 创建存储PDF的文件夹
  27.     pdf_folder = os.path.join(target_directory, "PDF")
  28.     os.makedirs(pdf_folder, exist_ok=True)

  29.     # 用于追踪已经复制的PDF文件名称
  30.     copied_files = set()

  31.     # 遍历选择的每个目录
  32.     for folder in selected_directories:
  33.         for root, dirs, files in os.walk(folder):
  34.             for file in files:
  35.                 if file.endswith('.pdf'):
  36.                     if file not in copied_files:
  37.                         # 复制文件到目标文件夹
  38.                         source_file = os.path.join(root, file)
  39.                         target_file = os.path.join(pdf_folder, file)
  40.                         shutil.copy(source_file, target_file)
  41.                         copied_files.add(file)

  42.     # 创建Excel文件
  43.     excel_data = {"名称": [], "超链接": []}
  44.     for file in copied_files:
  45.         file_name = os.path.splitext(file)[0]
  46.         file_path = os.path.join(pdf_folder, file)
  47.         excel_data["名称"].append(file_name)
  48.         excel_data["超链接"].append(f'=HYPERLINK("{file_path}", "{file}")')

  49.     # 将数据写入Excel
  50.     df = pd.DataFrame(excel_data)
  51.     excel_file_path = os.path.join(target_directory, "PDF汇总.xlsx")
  52.     df.to_excel(excel_file_path, index=False)

  53.     print("PDF汇总和Excel生成完毕!")

  54. # 创建Tkinter图形界面
  55. root = tk.Tk()
  56. root.title("PDF汇总工具")

  57. # 创建界面组件
  58. select_button = tk.Button(root, text="选择文件夹", command=select_folder)
  59. select_button.pack(pady=5)
  60. stop_button = tk.Button(root, text="停止选择", command=stop_selection)
  61. stop_button.pack(pady=5)
  62. listbox = tk.Listbox(root, width=80)
  63. listbox.pack(pady=5)

  64. # 启动Tkinter主循环
  65. root.mainloop()
复制代码


### 注意事项:
1. 确保已安装 `pandas` 和 `openpyxl` 库,因为pandas会用到它们来处理Excel文件,可以通过 `pip install pandas openpyxl` 安装。
2. 由于某些环境权限限制,选择存放Excel文件的文件夹时请确保对该目录有写权限。

这段代码使用了Tkinter来选择文件夹,并将PDF文件复制到指定位置并生成链接,确保你的PDF存放路径没有空格或非ASCII字符可能提高成功率。 你可以将其另存为 `.py` 文件来运行。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-21 15:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表