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

问题描述

我正在尝试将文件夹中的所有.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")]))

解决方法

首先,您可以使用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]))
,

如果我没记错的话,os.listdir默认会返回一个按名称排序的列表。如果要按上次修改时间对其进行排序,则可以使用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)

  • 返回上次修改路径的时间。返回值是一个浮点数,给出自纪元以来的秒数(请参见时间模块)。如果文件不存在或无法访问,请引发OSError。