Python合并文件夹PDF时排序与文件夹内顺序不符问题求助
解决PDF合并顺序与文件夹显示不一致的问题
你的代码能正常合并PDF,但os.listdir()返回的文件名是系统默认的字典序,和文件夹里的自然排序(比如数字按数值大小排列)不匹配,导致合并顺序错乱。
修复方案
方法1:使用natsort库(推荐,简单高效)
先安装依赖库:
pip install natsort
修改后的代码:
import os from PyPDF2 import PdfMerger from natsort import natsorted def combine_pdfs_from_folder(input_folder, output_path): pdf_merger = PdfMerger() # 用自然排序对PDF文件名排序 pdf_files = natsorted([f for f in os.listdir(input_folder) if f.endswith('.pdf')]) for filename in pdf_files: pdf_merger.append(os.path.join(input_folder, filename)) with open(output_path, 'wb') as output_file: pdf_merger.write(output_file) print("PDF files combined successfully.") if __name__ == "__main__": input_folder = r'E:\SRPlabel - 116843_C_3s' # 加r前缀避免转义字符解析问题 output_path = 'C:/tempo/merged.pdf' combine_pdfs_from_folder(input_folder, output_path)
方法2:纯Python实现自然排序(无需额外库)
如果不想安装第三方库,可以自定义排序键函数,提取文件名中的数字部分按数值排序:
import os from PyPDF2 import PdfMerger import re def natural_sort_key(s): # 拆分字符串为数字和非数字片段,数字转整数用于排序 parts = re.split(r'(\d+)', s) return [int(part) if part.isdigit() else part.lower() for part in parts] def combine_pdfs_from_folder(input_folder, output_path): pdf_merger = PdfMerger() # 用自定义自然排序键对文件名排序 pdf_files = sorted([f for f in os.listdir(input_folder) if f.endswith('.pdf')], key=natural_sort_key) for filename in pdf_files: pdf_merger.append(os.path.join(input_folder, filename)) with open(output_path, 'wb') as output_file: pdf_merger.write(output_file) print("PDF files combined successfully.") if __name__ == "__main__": input_folder = r'E:\SRPlabel - 116843_C_3s' output_path = 'C:/tempo/merged.pdf' combine_pdfs_from_folder(input_folder, output_path)
额外说明
- 输入路径添加
r前缀是为了避免路径中的转义字符(比如\S)被解析为特殊字符,引发路径错误。 - 两种方案都能让文件名按自然顺序排列,和文件夹内显示的顺序完全一致。
内容的提问来源于stack exchange,提问作者simport six
相关产品推荐
相关产品推荐

