Использование os.walk для перемещения по каталогу и выполнения скрипта - PullRequest
0 голосов
/ 05 ноября 2018

В настоящее время я работаю над проектом, который возьмет сколько угодно папок и объединит содержимое каждой папки в pdf. Это означает, что каждая папка будет выводить один PDF. Мне удалось выяснить, как объединить файлы, с которыми я работаю, в отдельный PDF-файл, используя ReportLab. Теперь мне нужно, чтобы он перебрал каждую папку и создал PDF. Пока что я могу использовать os.walk для запуска моих тестовых каталогов, но он не будет запускать скрипт pdf.

import glob
import os
import re
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Image, PageBreak
from reportlab.lib.units import inch

list_of_files = ["C:\\foo_1", "C:\\foo_2"]    

os.chdir("C:\\foo")
for root, dirs, files in os.walk(".", topdown = False):
   for name in files: 
      print(os.path.join(root, name)) #used to see where os.walk is working
      def sorted_nicely( l ):
        """ 
        /2035771/kak-otsortirovat-bukvenno-tsifrovoi-nabor-v-python
        Sort the given iterable in the way that humans expect.
        """ 
        convert = lambda text: int(text) if text.isdigit() else text 
        alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 
        return sorted(l, key = alphanum_key)

      def collect_issue(fname):
            if not fname.endswith(".pdf"):
                fname += ".pdf"
                doc = SimpleDocTemplate(fname,pagesize=letter,
                                        rightMargin=0,leftMargin=0,
                                        topMargin=0,bottomMargin=0)
                width = 7.5*inch
                height = 9.5*inch    

                picture_file_names = sorted_nicely(glob.glob("*.jp2"))
                contents = []
                for pic_fname in picture_file_names:
                    im = Image(pic_fname, width=width, height=height)
                    contents.append(im)
                    contents.append(PageBreak())
                doc.build(contents)

      if __name__ == "__main__":
            collect_issue("test")

Я специально обращаюсь за помощью с помощью os.walk, чтобы скрипт pdf запускался через столько папок, сколько мне нужно. Я не совсем уверен, что именно заставляет это не работать также. Для справки, большая часть этого кода основана на этом скрипте .

1 Ответ

0 голосов
/ 09 ноября 2018

Это общее не элегантное решение, но этого достаточно, и он решил мой первоначальный вопрос.

import glob
import os
import re
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph, Image, PageBreak
from reportlab.lib.units import inch


os.chdir("C:\\Foo")
file_num = 0
for root, dirs, files in os.walk(".", topdown = False):
    def collect_issue(fname):
        if not fname.endswith(".pdf"):
            fname += ".pdf"
            doc = SimpleDocTemplate(fname,pagesize=letter,
                  rightMargin=0,leftMargin=0,
                  topMargin=0,bottomMargin=0)
            width = 7.5*inch
            height = 9.5*inch    

            contents = []
            print(root)
            for name in files: 
                im = Image(root + "\\" + name, width, height)

                contents.append(im)
                contents.append(PageBreak())
            if contents:
                doc.build(contents)       

    collect_issue("test" + str(file_num))
    file_num += 1
...