python glob или listdir для создания и сохранения файлов из одного каталога в другой - PullRequest
0 голосов
/ 25 марта 2020

Я конвертирую документы из PDF в текст. PDF-файлы в настоящее время находятся в одной папке и затем сохраняются в другой после преобразования TXT. У меня много этих документов, и я предпочел бы перебирать подпапки и сохранять в подпапке с тем же именем в папке txt, но у меня возникли проблемы с добавлением этого слоя.

Я понимаю, что могу использовать glob для рекурсивной итерации и делать это для списков файлов и т. Д. c. Но неясно, как я могу сохранить файлы из этой папки в новую. Это не совсем необходимо, но было бы намного удобнее и эффективнее.

Есть ли хороший способ сделать это?

import os
import io
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage


def convert(fname, pages=None):
    if not pages:
        pagenums = set()
    else:
        pagenums = set(pages)

    output = io.StringIO()
    manager = PDFResourceManager()
    converter = TextConverter(manager, output, laparams=LAParams())
    interpreter = PDFPageInterpreter(manager, converter)

    infile = open(fname, 'rb')
    for page in PDFPage.get_pages(infile, pagenums):
        interpreter.process_page(page)
    infile.close()
    converter.close()
    text = output.getvalue()
    output.close
    return text 
    print(text)



def convertMultiple(pdfDir, txtDir):
    if pdfDir == "": pdfDir = os.getcwd() + "\\" #if no pdfDir passed in 
    for pdf in os.listdir(pdfDir): #iterate through pdfs in pdf directory
        fileExtension = pdf.split(".")[-1]
        if fileExtension == "pdf":
            pdfFilename = pdfDir + pdf 
            text = convert(pdfFilename)  
            textFilename = txtDir + pdf.split(".")[0] + ".txt"
            textFile = open(textFilename, "w")  
            textFile.write(text)  


pdfDir = r"C:/Users/Documents/pdf/"
txtDir = r"C:/Users/Documents/txt/"
convertMultiple(pdfDir, txtDir)   

1 Ответ

1 голос
/ 25 марта 2020

Как вы и предполагали, glob прекрасно работает здесь. Он даже может фильтровать только .pdf файлы.

Раскомментируйте 3 строки после того, как вы его протестировали.

import os, glob

def convert_multiple(pdf_dir, txt_dir):
    if pdf_dir == "": pdf_dir = os.getcwd() # If no pdf_dir passed in 
    for filepath in glob.iglob(f"{pdf_dir}/**/*.pdf", recursive=True):
        text = convert(filepath)
        root, _ = os.path.splitext(filepath) # Remove extension
        txt_filepath = os.path.join(txt_dir, os.path.relpath(root, pdf_dir)) + ".txt"
        txt_filepath = os.path.normpath(txt_filepath) # Not really necessary
        print(txt_filepath)
#        os.makedirs(os.path.dirname(txt_filepath), exist_ok=True)
#        with open(txt_filepath, "wt") as f:
#            f.write(text)


pdf_dir = r"C:/Users/Documents/pdf/"
txt_dir = r"C:/Users/Documents/txt/"
convert_multiple(pdf_dir, txt_dir)   

Чтобы определить путь к файлу для нового файла .txt, используйте функции из модуля os.path.

os.path.relpath(filepath, pdf_dir) возвращает путь к файлу файла, включая любые подкаталоги, относящиеся к pdf_dir.

Предположим, filepath:

C:/Users/Documents/pdf/Setec Astronomy/employees.pdf

и pdf_dir равно

C:/Users/Documents/pdf/

Возвращается Setec Astronomy/employees.pdf, которое затем может быть передано в os.path.join() вместе с txt_dir, что дает нам полный путь к файлу с включенными дополнительными подкаталогами.

Вы можете сделать txt_filepath = filepath.replace(filepath, pdf_dir), но вы должны убедиться, что все соответствующие косые черты в одном направлении, и там нет лишних / отсутствующих начальных / конечных слешей.

Перед открытием нового файла .txt необходимо создать все подкаталоги. os.path.dirname() вызывается для получения пути к файлу каталога файла, а os.makedirs() с аргументом exist_ok, установленным на True, для подавления исключения FileExistsError, если каталог уже существует.

A Оператор with используется при открытии файла .txt, чтобы избежать явного вызова .close(), особенно в случае каких-либо исключений.

...