2013-09-18 2 views
0

У меня есть вопрос относительно Python и pyPdf.Организация PDF-файлов в 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

Как вы узнаете, какой файл является? – kindall

+0

И какова логика этого заказа? Я., если бы было 8 файлов, как бы я определил порядок? – kindall

+0

Хорошие вопросы! Файлы будут выглядеть так: 091813lista 091813listb 091813listc и так далее. Дата изменится в зависимости от сегодняшней даты. –

ответ

0

os.listdir возвращает список имен файлов в произвольном порядке, поэтому вы должны заказать его элементы, как вы хотите, прежде чем обрабатывать их. Метод сортировки класса list позволит вам это сделать. Если предположить, что суффиксы «а», «б», ... являются заказ вы хотите, сортировка по дате часть имени, а затем суффикс даст то, что вы хотите:

fileList.sort (ключ = lambda fname: (fname [: 6], fname [-1]))

Этот тип файлаList на месте. Обратите внимание, что это в стиле Python 3.x, где sort передается функция с одним аргументом, возвращающая ключ для сортировки (здесь, составной ключ), а не функцию сравнения с двумя аргументами. Однако приведенный выше пример также работает в Python 2.4 и выше, что добавило ключевую функцию в качестве аргумента ключевого слова. Если вам интересно, ознакомьтесь с документами python 2.7 list.sort для более подробной информации, а также в разделе Сортировка HOWTO (также в документах). Если вы абсолютно, абсолютно уверен, что все файлы в каталоге будут иметь ту же дату, вы можете получить с:

fileList.sort (ключ = лямбда имя_файла: FName [-1])

Если «a», «b», ... не тот порядок, который вам нужен, вам понадобится дополнительная косвенность, сопоставление этих суффиксов с желаемым порядком - скажем, словарь, lookup_table, суффиксы отображения для ints в том порядке, в котором вы хотите. В этом случае вы должны использовать lookup_table[fname[-1]] вместо fname[-1]. Однако я не могу сказать много о том, как построить lookup_table, основываясь на том, что вы связали (например, всегда есть 7 файлов, это неясно).

+0

Это имеет смысл. Из-за моей новизны на Python, какой был бы рекомендуемый способ сделать это в Python 2.7? –

+0

Я отредактировал мой ответ для охвата 2.7 – BrianO

+0

Чтобы ответить выше, всегда есть 7 файлов. Единственное, что изменит имя файла, - это дата. Например, 091913_fileA, 092013_fileA и т. Д. –

Смежные вопросы