Сортировка списка файлов с использованием Python - PullRequest
3 голосов
/ 13 мая 2011

Мне нужно объединить папку, полную 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 ]

10 голосов
/ 13 мая 2011

попробуйте поставить () после pdfList.sort как в:

pdfList.sort()

То, как вы это написали, на самом деле не будет сортировать список. Я собрал ваш список имен файлов, поместил их в массив, и они отсортированы в порядке, в котором вы их показываете.

8 голосов
/ 14 мая 2011

Что вам нужно, это реализовать «Сравнение строк естественного порядка». Надеюсь, кто-то уже сделал это и поделился им.

РЕДАКТИРОВАТЬ: Вот грубая силаПример этого в 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)
3 голосов
/ 13 мая 2011

Заменить pdfList.sort на

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

или

pdfList = sorted(pdfList, key = lambda x: x.rsplit('.', 1)[0]) чтобы игнорировать расширение файла при сортировке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...