我对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)
答案 0 :(得分:0)
os.listdir以任意顺序返回文件名列表,因此您必须在处理它们之前根据需要对其元素进行排序。列表类的排序方法将允许您这样做。假设您的后缀'a','b',...是您想要的顺序,按文件名的日期部分排序,然后后缀将给出您想要的内容:
fileList.sort(key = lambda fname:(fname [:6],fname [-1]))
这会对fileList进行排序。 请注意,这是Python 3.x样式,其中sort传递一个参数函数,返回键进行排序(此处为复合键),而不是双参数比较函数。 但是,上面显示的示例也适用于Python 2.4及更高版本,它将关键函数添加为关键字参数。如果您感到好奇,请参阅Python 2.7 list.sort文档以获取更多详细信息,如以及排序HOWTO(也在文档中)。 如果您绝对确定目录中的所有文件都具有相同的日期,那么您可以使用:
fileList.sort(key = lambda fname:fname [-1])
如果'a','b',...不是你想要的顺序,那么你需要额外的间接,将这些后缀映射到所需的顺序 - 比如,字典,lookup_table
,按所需顺序将后缀映射到整数。在这种情况下,您使用的是lookup_table[fname[-1]]
,而不仅仅是fname[-1]
。但是,基于你所关注的内容,我不能说很多关于如何构造lookup_table
(例如,总有7个文件吗?它还不清楚)。