2015-07-21 3 views
1

Код, с которым я работаю, принимает файл .pdf и выводит .txt-файл. Мой вопрос: как мне создать цикл (возможно, цикл for), который снова и снова запускает код для всех файлов в папке, которая заканчивается на «.pdf»? Кроме того, как я могу изменить вывод каждый раз, когда цикл работает, чтобы каждый раз я мог писать новый файл, который имеет то же имя, что и входной файл (например, 1_pet.pdf> 1_pet.txt, 2_pet.pdf> 2_pet. .txt, и т.д.)Как применить мой код python ко всем файлам в папке за один раз и как мне создать новое имя для каждого последующего выходного файла?

Вот код до сих пор:

path="2_pet.pdf" 
content = getPDFContent(path) 
encoded = content.encode("utf-8") 
text_file = open("Output.txt", "w") 
text_file.write(encoded) 
text_file.close() 
+0

возможный дубликат [Найти все файлы в директории с расширением .txt с питоном] (HTTP: // StackOverflow .com/questions/3964681/find-all-files-in-directory-with-extension-txt-with-python) –

ответ

0

Создайте функцию, которая инкапсулирует то, что вы хотите сделать для каждого файла.

import os.path 

def parse_pdf(filename): 
    "Parse a pdf into text" 
    content = getPDFContent(filename) 
    encoded = content.encode("utf-8") 
    ## split of the pdf extension to add .txt instead. 
    (root, _) = os.path.splitext(filename) 
    text_file = open(root + ".txt", "w") 
    text_file.write(encoded) 
    text_file.close() 

Затем примените эту функцию в список имен файлов, например:

for f in files: 
    parse_pdf(f) 
+0

Похоже, что это сработает! Проблема в том, что мне нужны файлы для ссылки на мой каталог. Я бы сделал это так? 'files =" Пользователи/Jack/Downloads/pyPdf-1.13 "' –

+0

Вы можете получить файлы из каталога с помощью glob, как в ответ Роба – ajerneck

+0

Это помогло и действительно сработало (вроде). У меня теперь есть проблема, что именованные текстовые файлы возвращаются, но они пусты, и когда я пытаюсь сделать несколько сотен файлов, я получаю ошибку 'pyPdf.utils.PdfReadError: EOF-маркер не найден. Есть ли у вас какие-либо идеи, почему это происходит? Я очень ценю вашу помощь! –

0

Один из способов работать на всех PDF файлов в каталоге, чтобы вызвать glob.glob() и перебирать результаты:

import glob 
for path in glob.glob('*.pdf') 
    content = getPDFContent(path) 
    encoded = content.encode("utf-8") 
    text_file = open("Output.txt", "w") 
    text_file.write(encoded) 
    text_file.close() 

Другой способ - разрешить пользователю указывать файлы:

import sys 
for path in sys.argv[1:]: 
    ... 

Тогда пользователь запускает ваш скрипт как python foo.py *.pdf.

+0

Я просто добавил это в свой код, и он работал без каких-либо ошибок, однако мой выходной файл относится только к к моему первому pdf-файлу. Есть ли причина, по которой он не может проходить мимо первого файла? Кроме того, как я могу изменить вывод во время каждой итерации цикла for, чтобы отобразить имя файла pdf-файла? –

0

Вы можете использовать рекурсивную функцию для поиска папки и все вложенные папки для файлов, которые заканчиваются PDF. Затем возьмите эти файлы, а затем создайте для него текстовый файл.

Это может быть что-то вроде:

import os 

def convert_PDF(path, func): 
    d = os.path.basename(path) 
    if os.path.isdir(path): 
     [convert_PDF(os.path.join(path,x), func) for x in os.listdir(path)] 
    elif d[-4:] == '.pdf': 
     funct(path) 

# based entirely on your example code 
def convert_to_txt(path): 
    content = getPDFContent(path) 
    encoded = content.encode("utf-8") 
    file_path = os.path.dirname(path) 
    # replace pdf with txt extension 
    file_name = os.path.basename(path)[:-4]+'.txt' 
    text_file = open(file_path +'/'+file_name, "w") 
    text_file.write(encoded) 
    text_file.close() 

convert_PDF('path/to/files', convert_to_txt) 

Поскольку фактическая операция изменчива, вы можете заменить функцию с любой операцией необходимо выполнить (например, используя другую библиотеку, преобразование в другой тип, и т.д. .)

2

следующий сценарий решить вашу проблему:

import os 

sourcedir = 'pdfdir' 

dl = os.listdir('pdfdir') 

for f in dl: 
    fs = f.split(".") 
    if fs[1] == "pdf": 
     path_in = os.path.join(dl,f) 
     content = getPDFContent(path_in) 
     encoded = content.encode("utf-8") 
     path_out = os.path.join(dl,fs[0] + ".txt") 
     text_file = open(path_out, 'w') 
     text_file.write(encoded) 
     text_file.close() 
+0

Для этой цели была допущена следующая ошибка: 'dl = os.dirlist (« Пользователи/Jack/Downloads/pyPdf-1.13 ») AttributeError: объект 'module' не имеет атрибута 'dirlist'' –

+0

Извините, listdir не dirlist , моя ошибка, я иссяк. – Geeocode

+0

Обратите внимание, что этот код также решает поиск каталога, в отличие от принятого ответа. – Geeocode