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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:59:07