Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 11, 2017 13:39:48

Acamori
Зарегистрирован: 2017-04-11
Сообщения: 47
Репутация: +  1  -
Профиль   Отправить e-mail  

Импорт из PDF -> Преобразование -> Экспорт значений

Всем привет, недавно начал изучать python и еще всего не знаю, но есть вопрос, о возможности реализации задуманного.

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

С помощью PyPDF2 достаю текст из PDF.

 >>> import PyPDF2
>>> pdfFileObj = open('my.pdf','rb')
>>> pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
>>> pageObj = pdfReader.getPage(0)
>>> P1 = pageObj.extractText()
"€111 Some Ct, Some Nice Twp, ST 888881.8 miResidentialExterior: Brick Exterior, Shingle Exterior, Pitched Roof, Shingle Roof, Fencing, Sidewalks, Street Lights, Deck, Patio, Front Yard, Rear Yard, Side Yard(s), No Swimming Pool Ł Utilities: (1)Central Air, (2)Gas Heating, Hot Air......"
>>> pageObj = pdfReader.getPage(1)
>>> P2 = pageObj.extractText()
>>> P2
"€222 Some Ct, Some Nice Twp, ST 999991.8 miResidentialExterior: Brick Exterior, Shingle Exterior, Pitched Roof, Shingle Roof, Fencing, Sidewalks, Street Lights, Deck, Patio, Front Yard, Rear Yard, Side Yard(s), In-Ground Swimming Pool Ł Utilities: (1)No Air Condidioning, (2)Oil Heating, Hot Air......"

И теперь я хочу из этих строк вытянуть значения для других переменных с которыми дальше планируется работа. Вот такой примерно вид переменных хотелось бы получить:

 >>> A1ad = '111 Some ct'
>>>A1tw = 'Some Nice Twp'
>>>A1st = 'ST'
>>>A1zp = 88888
>>>A1pool = 'No Swimming Pool'
>>>A1util = {A:'Central Air',  H:'Gas Heating'}

Такой же принцип и с P2 для переменной A2**. Срезы или индексирование не особо подойдут так как значения могут быть разной длины, но почти всегда имеют какой либо “опознавательный” признак откуда можно начинать поиск, в данном примере ими могут быть значения Exterior: и Ł Utilities:.

Подойдет ли тут стандартное форматирование строки или же модуль re ? Да и вообще возможна ли такая вытяжка данных ?



Отредактировано Acamori (Апрель 11, 2017 13:52:50)

Офлайн

#2 Апрель 11, 2017 15:46:36

Acamori
Зарегистрирован: 2017-04-11
Сообщения: 47
Репутация: +  1  -
Профиль   Отправить e-mail  

Импорт из PDF -> Преобразование -> Экспорт значений

Часть задачи к примеру с ‘No Swimming Pool’ и A1util = {A:'Central Air', H:'Gas Heating'} можно решить слегка громоздкими проверками if и else. Но вот для вытяжки некоторых уникальных значений не нашел способа.

Офлайн

#3 Апрель 11, 2017 16:44:03

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Импорт из PDF -> Преобразование -> Экспорт значений

Acamori
Подойдет ли тут стандартное форматирование строки или же модуль re ?
Лучше будет использовать re. Сначала достаёшь все строки, а потом их присваиваешь нужным переменным.

Это пример
  
>>> import re
>>> 
>>> s = '€111 Some Ct, Some Nice Twp, ST 888881.8 miResidentialExterior:'
>>> 
>>> pat = r'^€(.*?),\s*(.*?),\s*(\S*)\s*(\d*)'
>>> 
>>> match = re.search(pat, s)
>>> if match is not None:
...     a, b, c, d = match.groups()
...     (a, b, c, d)
... 
('111 Some Ct', 'Some Nice Twp', 'ST', '888881')
>>>



Отредактировано py.user.next (Апрель 11, 2017 16:45:59)

Офлайн

#4 Апрель 11, 2017 18:01:15

Acamori
Зарегистрирован: 2017-04-11
Сообщения: 47
Репутация: +  1  -
Профиль   Отправить e-mail  

Импорт из PDF -> Преобразование -> Экспорт значений

py.user.next
Лучше будет использовать re. Сначала достаёшь все строки, а потом их присваиваешь нужным переменным.

Беда в том, что PyPDF2 достает весь текст единой строкой, а требуемые уникальные объекты могут располагаться по всей строке, как в начале, так и в середине. Подойдет в таком случае этот метод ?

Офлайн

#5 Апрель 12, 2017 02:34:36

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Импорт из PDF -> Преобразование -> Экспорт значений

Acamori
Беда в том, что PyPDF2 достает весь текст единой строкой
Надо сначала всё достать из pdf и сохранить в виде строк, а потом работать с ними, как будто не было никакого pdf'а.

Acamori
а требуемые уникальные объекты могут располагаться по всей строке, как в начале, так и в середине
Проанализируй, как ты сам понимаешь, где какой объект, и в программу то же самое запиши. Если ты ищешь, например, по запятой, значит и программа должна искать по запятой. Если ты видишь там названия с больших букв, значит и программа должна искать названия, проверяя величину букв.

Acamori
Подойдет в таком случае этот метод ?
Подойдёт. Если что-то не получается ты можешь несколько шаблонов сделать. Допустим, у тебя строка может иметь три формы, значит сначала нужно определить, в какой она форме из трёх, а потом применить соответствующий разбор. Для каждого разбора может быть свой индивидуальный шаблон.



Отредактировано py.user.next (Апрель 12, 2017 02:36:10)

Офлайн

#6 Апрель 12, 2017 08:11:07

Acamori
Зарегистрирован: 2017-04-11
Сообщения: 47
Репутация: +  1  -
Профиль   Отправить e-mail  

Импорт из PDF -> Преобразование -> Экспорт значений

py.user.next
py.user.next

Спасибо за напутствие ! Буду дальше штудировать мануалы, а то чую пока рано за идею спохватился.

Отредактировано Acamori (Апрель 12, 2017 08:14:14)

Офлайн

#7 Апрель 12, 2017 11:13:42

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Импорт из PDF -> Преобразование -> Экспорт значений

Acamori
Буду дальше штудировать мануалы
Тут надо алгоритм составить, мануалы по питону в этом не помогут. Потому что сначала нужно определить, что нужно сделать, чтобы всё правильно вытащить (по каким признакам искать и так далее), а уже потом, когда это определено, надо думать, как реализовать это на питоне (и вот тогда пригодится документация к питону, где все средства описаны). А само собой оно не будет работать, потому что питон - это инструмент. Если у тебя есть молоток и пила, это ещё не значит, что они сами приготовят детали и соберут табуретку.



Отредактировано py.user.next (Апрель 12, 2017 11:14:36)

Офлайн

#8 Апрель 12, 2017 11:47:57

Acamori
Зарегистрирован: 2017-04-11
Сообщения: 47
Репутация: +  1  -
Профиль   Отправить e-mail  

Импорт из PDF -> Преобразование -> Экспорт значений

py.user.next
Тут надо алгоритм составить, мануалы по питону в этом не помогут. Потому что сначала нужно определить, что нужно сделать, чтобы всё правильно вытащить (по каким признакам искать и так далее), а уже потом, когда это определено, надо думать, как реализовать это на питоне (и вот тогда пригодится документация к питону, где все средства описаны). А само собой оно не будет работать, потому что питон - это инструмент. Если у тебя есть молоток и пила, это ещё не значит, что они сами приготовят детали и соберут табуретку.

Ну я больше к тому, что мне надо больше понять как работать с модулем re, что б начать подбирать алгоритм выборки и соответствия.
И пока еще не определил для себя наилучший способ разбития единой строки в несколько разных, так как в PDF'ах длина ее может различаться. Часть можно разбивать по ключевым словам “Exterior”, “Parking”, “Utilities”, а часть данных надо искать с другим алгоритмом. Вот для этого моих знаний пока не хватает

Отредактировано Acamori (Апрель 12, 2017 11:48:28)

Офлайн

#9 Апрель 12, 2017 15:00:36

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Импорт из PDF -> Преобразование -> Экспорт значений

Acamori
Ну я больше к тому, что мне надо больше понять как работать с модулем re, что б начать подбирать алгоритм выборки и соответствия.
Надо придумать алгоритм выборки, а потом записать его с помощью regex'ов (да и то, regex'ы - не единственный вариант, там может и комбинирование понадобиться). Если ты алгоритм не придумаешь, то regex'ы тебе никак не помогут, потому что это просто инструмент. Питон - инструмент, regex'ы - инструмент. Представь, что regex'ы - это молоток, который ты берёшь и, постукивая по доске в разных местах, пытаешься дом построить. Тут в молотке решения нет, должен быть план, должен быть спроектирован дом сам. Так же и с алгоритмами происходит: сначала ты придумываешь алгоритм, не вовлекая языки программирования и их средства, а потом, когда он готов, реализуешь его на языке каком-нибудь.

Acamori
И пока еще не определил для себя наилучший способ разбития единой строки в несколько разных, так как в PDF'ах длина ее может различаться.
Ты должен сначала все строки выбрать скопом, чтобы отвязаться от pdf-формата. И вот когда у тебя будет текст, вытащенный из pdf, тогда и надо его разбирать (написать функцию разбора текста).



Отредактировано py.user.next (Апрель 12, 2017 15:04:38)

Офлайн

#10 Апрель 12, 2017 15:05:38

Acamori
Зарегистрирован: 2017-04-11
Сообщения: 47
Репутация: +  1  -
Профиль   Отправить e-mail  

Импорт из PDF -> Преобразование -> Экспорт значений

py.user.next
Ты должен сначала все строки выбрать скопом, чтобы отвязаться от pdf-формата. И вот когда у тебя будет текст, вытащенный из pdf, тогда и надо его разбирать (написать функцию разбора текста).

Так вот PyPDF2 и достает из pdf файла весь текст и импортирует его одной единой строкой.

 P1 = pageObj.extractText()
"€111 Some Ct, Some Nice Twp, ST 888881.8 miResidentialExterior: Brick Exterior, ......."

Вот тут переменной P1 присваивается значение строки вытянутой с помощью операции pageObj.extractText(). В результате имеем одну длинную строку которую надо будет дробить на составные части или же сразу в ней искать нужные значения. Вот и думаю над алгоритмами поиска нужных частей.

Отредактировано Acamori (Апрель 12, 2017 16:00:32)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version