pdfplumber дает fp.seek(pos) AttributeError: объект 'dict' не имеет атрибута 'seek'
Итак, это мой код:
def main():
import combinedparser as cp
from tkinter.filedialog import askopenfilenames
files = askopenfilenames()
print(files) #this gives the right files as a list of strings composed of path+filename
def file_discriminator(func):
def wrapper():
results = []
for item in files:
if item.endswith('.pdf'):
print(item + 'is pdf')
func = f1(file = item)
results.append(item, Specimen_Output)
else:
print(item + 'is text')
func = f2(file = item)
results.append(item, Specimen_Output)
return wrapper
@file_discriminator
def parse_me(**functions):
print(results)
parse_me(f1 = cp.advparser(), f2 = cp.vikparser())
главный()
где Combinedparser.py имеет две функции:
def advparser(**file):
import pdfplumber
with pdfplumber.open(file) as pdf: # opened fname and assigned it to the variable pdf
page = pdf.pages[0] # assigned index 0 of pages to the variable page
text = page.extract_words()
#followed by a series of python operations generating a dict named Specimen_Output
def vikparser(**file):
with open(file, mode = 'r') as filename:
Specimen_Output = {}
#followed by a series of python operations generating a dict named Specimen_Output
У меня есть каталог с произвольными вкраплениями pdf и текстовых файлов. Я пытаюсь использовать декоратор @file_discriminator для запуска функции advparser, которая использует pdfplumber и последующую обработку для извлечения полезной информации из файлов pdf в файлы pdf в каталоге; и vikparser для выполнения обычной обработки текстовых файлов в текстовых файлах. Каждый должен создать словарь под названием Specimen_Output. Я получил правильные результаты, когда advparser был отдельным файлом.py, запущенным как advparser(файл), импортированным askopenfilename вместо его множественного числа и вызванным с помощью advparser(file = askopenfilename()); аналогично с vikparser (который просматривает текстовые файлы со строками чтения). Но когда я пытаюсь сделать это из основного модуля и использую родительскую функцию для их вызова, я не могу заставить его работать. Я'Я пробовал почти все возможные варианты того, где я их называю, а также использовал аргументы позиционного и ключевого слова для "файла".
Когда я исправляю любые ошибки, которые создаю из-за изменений, это самая распространенная ошибка, которую я получаю:
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/_pydev_bundle/pydev_umd.py", line 197, in runfile
pydev_imports.execfile(filename, global_vars, local_vars) # execute the script
File "/Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "/Users/zachthomasadmin/PycharmProjects/pythonProject1/main.py", line 29, in <module>
parse_me(f1 = cp.advparser(), f2 = cp.vikparser())
File "/Users/zachthomasadmin/PycharmProjects/pythonProject1/combinedparser.py", line 12, in advparser
with pdfplumber.open(file) as pdf: # opened fname and assigned it to the variable pdf
File "/Users/zachthomasadmin/PycharmProjects/pythonProject1/venv/lib/python3.8/site-packages/pdfplumber/pdf.py", line 48, in open
return cls(path_or_fp, **kwargs)
File "/Users/zachthomasadmin/PycharmProjects/pythonProject1/venv/lib/python3.8/site-packages/pdfplumber/pdf.py", line 25, in __init__
self.doc = PDFDocument(PDFParser(stream), password=password)
File "/Users/zachthomasadmin/PycharmProjects/pythonProject1/venv/lib/python3.8/site-packages/pdfminer/pdfparser.py", line 39, in __init__
PSStackParser.__init__(self, fp)
File "/Users/zachthomasadmin/PycharmProjects/pythonProject1/venv/lib/python3.8/site-packages/pdfminer/psparser.py", line 502, in __init__
PSBaseParser.__init__(self, fp)
File "/Users/zachthomasadmin/PycharmProjects/pythonProject1/venv/lib/python3.8/site-packages/pdfminer/psparser.py", line 172, in __init__
self.seek(0)
File "/Users/zachthomasadmin/PycharmProjects/pythonProject1/venv/lib/python3.8/site-packages/pdfminer/psparser.py", line 514, in seek
PSBaseParser.seek(self, pos)
File "/Users/zachthomasadmin/PycharmProjects/pythonProject1/venv/lib/python3.8/site-packages/pdfminer/psparser.py", line 202, in seek
self.fp.seek(pos)
AttributeError: 'dict' object has no attribute 'seek'
Что я делаю неправильно? О каком объекте dict идет речь, и почему у pdfplumber нет этой проблемы, когда я пытаюсь выполнить каждый тип индивидуального вызова из askopenfilename()? Я новичок в программировании и весь день рвал себе волосы. Благодаря!
1 ответ
Проблема в том, что ваш
file
аргумент в
advparser
и
vikparser
functions фактически является словарем именованных аргументов, потому что он определен двумя звездочками. Итак, когда вы вызываете эти функции таким образом
func = f1(file = item)
твой
file
аргумент в
advparser
или же
vikparser
функции фактически равно
{"file": "some_filename.pdf"}
.
Вам нужно либо распаковать свои аргументы:
def vikparser(**file):
with open(file["file"], mode='r') as filename:
pass
или просто используйте одиночный
file
аргумент в определениях функций:
def vikparser(file):
with open(file, mode='r') as filename:
pass