有没有办法在导入文件进入循环之前对其进行排序?

Is there a way to order imported files before they are brought into a loop?

我正在尝试将文件夹中的所有 .job 文件转换为单个 pdf。这段代码是这样做的,但是它们没有特定的顺序。我希望它们按照文件创建时间的顺序导入,或者它们的文件名遵循设定的模式 'XXX_1.jpg'

这是我目前拥有的:

import img2pdf
os.chdir('C:/Path')
# convert all files ending in .jpg inside a directory

with open("output.pdf", "wb") as f:
    f.write(img2pdf.convert([i for i in os.listdir('.') if i.endswith(".jpg")]))

如果我没记错的话,os.listdir returns 默认是一个 name-sorted 列表。如果你想按最后修改时间排序,你可以使用 os.getmtime 作为键对它们进行排序:

#import img2pdf
#import os

os.chdir('C:/Path')
paths = sorted(os.listdir('.'), key=os.path.getmtime)

with open("output.pdf", "wb") as f:
    f.write(img2pdf.convert([i for i in paths if i.endswith(".jpg")]))

有关详细信息,请参阅文档:https://docs.python.org/3/library/os.path.html

os.path.getmtime(path)

  • Return the time of last modification of path. The return value is a floating point number giving the number of seconds since the epoch (see the time module). Raise OSError if the file does not exist or is inaccessible.

首先,您可以使用glob将您目录中files的所有路径收集到一个列表中。然后用os模块getctime,就可以得到创建时间列表。我压缩了两个列表,然后制作了一个字典,其键是文件路径和值 - 创建时间。最后,我使用运算符模块按值排列了字典,以按值的降序排列所有字典(即,首先是最新文件)

import os
import glob
import operator
import img2pdf

a= glob.glob("my_directory/*.jpg")
b = [os.path.getctime(i) for i in a]
c = {}
for i,j  in list(zip(a,b)):
    c[i] = j
sorted_c = dict(sorted(c.items(), key=operator.itemgetter(1),reverse=True))
with open("output.pdf", "wb") as f:
    f.write(img2pdf.convert([k for k in sorted_c]))