0

我有一个关于 Python 和 pyPdf 的问题。

我正在尝试做的是创建一个 PDF(显然),然后以某种方式对其进行排序。因此,每次我运行我的脚本时,它都会以某种方式对我进行排序,而不管文件是何时创建的。

如果我的目标文件夹中有 7 个文件,我希望它们在我的最终文件中排序为 7 4 3 2 1 6 5,无论它们最终如何放置在文件夹中。

我在下面的示例基本上可以满足我的要求,但没有按我的意愿订购 PDF。它目前按修改日期执行。这有意义吗?

我对 Python 游戏还很陌生,根本没有使用 pyPDF 的经验,所以非常感谢任何帮助!


def merge_pdfs(latest_dir):

startDir = latest_dir
os.chdir(startDir)
outFile = '%s_DepartmentalTaskList.pdf'%(time.strftime("%m%d%y"))

if os.path.exists('%s/%s'%(latest_dir, outFile)):
os.system('rm %s/%s'%(latest_dir, outFile))

fileList = os.listdir(startDir)
output = pyPdf.PdfFileWriter()

for item in fileList:
print 'item = %s'%item
    if os.path.splitext(item)[1].upper() == ".PDF":
        pdfDocument = os.path.join(startDir,item)
        input1 = pyPdf.PdfFileReader(file(pdfDocument, "rb"))
    for page in range(input1.getNumPages()):
        output.addPage(input1.getPage(page))


print 'outFile = %s'%outFile
outputStream = file(outFile, "wb")
output.write(outputStream)
outputStream.close()

return '%s/%s'%(startDir, outFile)
4

1 回答 1

0

os.listdir 以任意顺序返回文件名列表,因此在处理它们之前,您必须根据需要对其元素进行排序。列表类的排序方法可以让你这样做。假设您的后缀 'a', 'b', ... 是您想要的顺序,按文件名的日期部分排序,然后后缀将给出您想要的:

fileList.sort(key=lambda fname: (fname[:6], fname[-1]) )

这对文件列表进行了适当的排序。请注意,这是 Python 3.x 风格,其中 sort 传递一个单参数函数,返回要排序的键(这里是复合键),而不是双参数比较函数。但是,上面显示的示例也适用于 Python 2.4 及更高版本,它添加了 key 函数作为关键字参数。如果您好奇,请参阅 Python 2.7 list.sort 文档以获取更多详细信息,以及 Sorting HOWTO(也在文档中)。如果您绝对肯定目录中的所有文件都具有相同的日期,则可以通过:

fileList.sort(key=lambda fname: fname[-1])

如果 'a', 'b', ... 不是您想要的顺序,那么您将需要额外的间接,将这些后缀映射到所需的顺序 - 例如,字典, lookup_table,按照您的顺序将后缀映射到整数想。在这种情况下,您将使用lookup_table[fname[-1]]而不是仅使用fname[-1]. lookup_table但是,根据您的相关内容,我不能说太多关于如何构建的内容(例如,总是有 7 个文件吗??不清楚)。

于 2013-09-18T23:23:45.033 回答