Фон
Я использую pdfquery для удаления данных из PDF-файлов. Нравится этот. Этот вопрос основан на моем предыдущем вопросе здесь а>.
Мне удалось успешно использовать пользовательские функции-оболочки, которые могут принимать аргументы, как показано в этом ответе. За исключением следующего, что доставляет мне проблемы, когда я пытаюсь запустить его несколько раз в блокноте jupyter;
Ячейка 1
import pdfquery
def load_file(PDF_FILE):
pdf = pdfquery.PDFQuery(PDF_FILE)
pdf.load()
return pdf
file_with_table = 'path_to_the_file_mentioned_above.pdf'
pdf = load_file(file_with_table)
Ячейка 2
def in_range(prop, bounds):
def wrapped(*args, **kwargs):
n = float(this.get(prop, 0))
return bounds[0] <= n <= bounds[1]
return wrapped
def is_element(element_type):
def wrapped(*args, **kwargs):
return this.tag in element_type
return wrapped
def str_len(condition):
def wrapped(*args, **kwargs):
cond = ''.join([str(len(this.text)),condition])
return eval(cond)
return wrapped
Ячейка 3
x_check = in_range('x0', (97, 160))
y_check = in_range('y0', (250, 450))
el_check = is_element(['LTTextLineHorizontal', 'LTTextBoxHorizontal'])
str_len = str_len('>0')
els = pdf.pq('LTPage[page_index="0"] *').filter(el_check)
els = els.filter(str_len)
els = els.filter(x_check)
els = els.filter(y_check)
[(i.text) for i in els]
Функция str_len
будет работать нормально, если она будет запущена один раз после определения;
Нет ошибок при запуске третьей изображенной ячейки
но выдает NameError
, когда я пытаюсь запустить функцию во второй раз;
NameError
после запуска третьей ячейки во второй раз.
Вот текст NameError
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-27-54cd329bb1e1> in <module>()
2 y_check = in_range('y0', (250, 450))
3 el_check = is_element(['LTTextLineHorizontal', 'LTTextBoxHorizontal'])
----> 4 str_len = str_len('>0')
5
6 els = pdf.pq('LTPage[page_index="0"] *').filter(el_check)
<ipython-input-25-654bff7d0eed> in wrapped(*args, **kwargs)
12 def str_len(condition):
13 def wrapped(*args, **kwargs):
---> 14 return eval(''.join([str(len(this.text)),condition]))
15 return wrapped
NameError: name 'this' is not defined
Вопросы
Почему я могу использовать эту функцию только один раз после ее определения?
Можно ли как-то обойти эту проблему?