使用Python将文件夹图片生成PDF时图片顺序不符问题咨询
问题原因分析与解决方案
这个问题很常见,根源在于字符串排序和数字排序的差异。
为什么顺序会乱?
os.listdir()返回的文件列表是按照**字典序(字符串ASCII码顺序)**排列的,而非我们直觉里的数字大小顺序。
举个具体例子:当比较bho10.jpg和bho2.jpg时,字符串是逐字符对比的——前三个字符bho完全一致,接下来第四个字符是1和2。由于字符1的ASCII值(49)比2(50)小,所以bho10.jpg会被判定为"更小",排在bho2.jpg前面。这就导致了你看到的:所有带1开头数字的文件先出现,接着是2开头的,以此类推。
解决方案:按文件名中的数字排序
我们需要自定义排序规则,提取文件名里的数字部分,按照数字大小来重新排列文件列表。
方法1:针对固定文件名格式
如果你的文件名都是bhoX.jpg这种固定格式,可以直接拆分字符串提取数字:
import os from PIL import Image file_path = input('file path of the images: ') # 定义提取数字的函数 def get_image_number(filename): # 去掉前缀"bho"和后缀".jpg",提取数字部分转成整数 num_str = filename.replace("bho", "").replace(".jpg", "") return int(num_str) # 先筛选出目标jpg文件(避免混入其他格式文件) image_files = [f for f in os.listdir(file_path) if f.lower().endswith(".jpg") and f.startswith("bho")] # 按数字大小排序文件列表 sorted_image_files = sorted(image_files, key=get_image_number) # 生成PDF的后续代码 pdfimages = [Image.open(os.path.join(file_path, f)) for f in sorted_image_files] print('=== Images used to create the PDF ===\n' +'>>> '+str(sorted_image_files)) pdf_name = "output" # 替换成你需要的PDF文件名 pdf_path = os.path.join(file_path, f"{pdf_name}.pdf") pdfimages[0].save(pdf_path, "PDF", resolution=100.0, save_all=True, append_images=pdfimages[1:]) print('=== PDF created and saved! ===') print('=== Check ===\n' +'>>> '+str(pdf_path))
方法2:通用数字提取(适配任意带数字的文件名)
如果文件名格式不固定,比如有不同前缀,用正则表达式提取数字会更灵活:
import re def get_image_number(filename): # 匹配文件名中的连续数字 num_match = re.search(r'\d+', filename) if num_match: return int(num_match.group()) return 0 # 无数字的文件会排在最前面,可根据需求调整
额外提示
- 用
os.path.join()拼接路径比直接用+更安全,能避免因为输入的file_path末尾没有斜杠而生成无效路径(比如/home/imgsbho1.jpg)。 - 提前筛选目标格式文件,可以避免
Image.open()因为非图片文件报错。
内容的提问来源于stack exchange,提问作者Edoardo Balducci
相关产品推荐
相关产品推荐

