使用Python排序文件列表

3 投票
3 回答
21686 浏览
提问于 2025-04-16 17:36

我需要把一个文件夹里的很多PDF文件合并成一个文件。不过,它们必须按照特定的顺序合并。下面是一些文件名的例子:

WR_Mapbook__1.pdf  
WR_Mapbook__1a.pdf  
WR_Mapbook__2.pdf  
WR_Mapbook__2a.pdf  
WR_Mapbook__3.pdf  
WR_Mapbook__3a.pdf  
etc...  

在Windows资源管理器中,它们的排序方式就是我想要的合并顺序。但是我的脚本却是先把所有带有“a”的文件加进去,然后再加没有“a”的文件。为什么会这样呢?我该怎么排序才能按照我想要的方式合并文件呢?

请看下面的代码。谢谢!

from pyPdf import PdfFileWriter, PdfFileReader  
import glob

outputLoc = "K:\\test\\pdf_output\\"
output = PdfFileWriter()


pdfList = glob.glob(r"K:\test\lidar_MB_ALL\*.pdf")
pdfList.sort
print pdfList
for pdf in pdfList:
    print pdf
    input1 = PdfFileReader(file(pdf, "rb"))
    output.addPage(input1.getPage(0))
    # finally, write "output" to document-output.pdf
    outputStream = file(outputLoc + "WR_Imagery_LiDar_Mapbook.pdf", "wb")
    output.write(outputStream)
    print ("adding " + pdf)

 outputStream.close()

3 个回答

3

pdfList.sort 替换成

pdfList = sorted(pdfList, key = lambda x: x[:-4])

或者

pdfList = sorted(pdfList, key = lambda x: x.rsplit('.', 1)[0]) 这样可以在排序的时候忽略文件的扩展名

10

试着在 pdfList.sort 后面加上 (),就像这样:

pdfList.sort()

你现在写的方式其实不会对列表进行排序。我把你的文件名放进一个数组里,然后它们按照你展示的顺序进行了排序。

11

你需要做的是实现一种叫做“自然顺序字符串比较”的东西。希望已经有人做过这个并分享出来了。

编辑:这里有一个用Python实现的简单粗暴的例子。

import re

digits = re.compile(r'(\d+)')
def tokenize(filename):
    return tuple(int(token) if match else token
                 for token, match in
                 ((fragment, digits.search(fragment))
                  for fragment in digits.split(filename)))

# Now you can sort your PDF file names like so:
pdfList.sort(key=tokenize)

撰写回答