Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 12, 2017 22:47:36

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

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

Acamori
В результате имеем одну длинную строку которую надо будет дробить на составные части или же сразу в ней искать нужные значения. Вот и думаю над алгоритмами поиска нужных частей.
Да какая разница, py.user.next пытаеться до вас донести другое, если данные неструктурированы, нужно определить признаки по которым вы будете искать нужную вам информацию.
Вот вы пишете A1pool = ‘No Swimming Pool’. А теперь ответте на вопрос почему в переменную “A1pool” вы занесли “No Swimming Pool” а не “Shingle Roof”? Ну например в переменную A1pool пишем текст начинающийся от запятой и заканчивающийся на Swimming Pool. Вот собственно первое условие поиска.+ ответте что должно заноситься, если ничего не найдет, или если найдет более одного.
Потом берете вторую переменную и делаете тоже самое. Когда вы составите полный перечень условий, можно будет думать как это орагнизовать, с помощью re или по иному както….



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Апрель 12, 2017 22:48:09)

Офлайн

#2 Апрель 13, 2017 06:03:29

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

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

Acamori
Вот тут переменной P1 присваивается значение строки вытянутой с помощью операции pageObj.extractText().
Ну всё, теперь думай, как разобрать строку. Как выше тебе писал: если можешь вручную разобрать её правильно, значит у тебя есть какой-то метод. Вот надо это всё вытащить наружу, задавая себе вопросы “как я вытянул это значение из всего текста?”, “как я определил, что всё правильно вытянул?”. Тогда ты узнаешь признаки, по которым определяешь всё. Очень часто это делается подсознательно (будто ты всегда умел это делать), поэтому надо себе задавать вопросы, чтобы вытащить наружу. Например, вот ты текст обычный читаешь глазами, а как ты понимаешь, какое слово прочитал? Ты заметил, что прочитал сначала каждую букву, определил значение этой буквы, определил, как она звучит? А ведь это не врождённое (попробуй на турецком что-нибудь прочитать или на китайском), это бессознательный навык, выработанный в начальной школе. Вот при поиске значений точно так же работают бессознательные навыки, которые надо вытащить и по ним составлять алгоритм разбора. А потом программу просто пишешь, которая фактически делает то же самое, что ты руками делал, и “думает” так же, как ты думал в тот момент, когда разбирал.



Отредактировано py.user.next (Апрель 13, 2017 06:28:57)

Офлайн

#3 Апрель 13, 2017 10:28:27

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

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

PEHDOM
Да какая разница, py.user.next пытаеться до вас донести другое, если данные неструктурированы, нужно определить признаки по которым вы будете искать нужную вам информацию.

И я это понял с первого же сообщения. Просто смутило разбитие на отдельные строки, когда единая строка всегда может быть разной длины и из разных составляющих. И я как раз думаю, как и по каким правилам мне все это доставать.

py.user.next
Ну всё, теперь думай, как разобрать строку. Как выше тебе писал: если можешь вручную разобрать её правильно, значит у тебя есть какой-то метод. Вот надо это всё вытащить наружу, задавая себе вопросы “как я вытянул это значение из всего текста?”, “как я определил, что всё правильно вытянул?”. Тогда ты узнаешь признаки, по которым определяешь всё. Очень часто это делается подсознательно (будто ты всегда умел это делать), поэтому надо себе задавать вопросы, чтобы вытащить наружу. Например, вот ты текст обычный читаешь глазами, а как ты понимаешь, какое слово прочитал? Ты заметил, что прочитал сначала каждую букву, определил значение этой буквы, определил, как она звучит? А ведь это не врождённое (попробуй на турецком что-нибудь прочитать или на китайском), это бессознательный навык, выработанный в начальной школе. Вот при поиске значений точно так же работают бессознательные навыки, которые надо вытащить и по ним составлять алгоритм разбора. А потом программу просто пишешь, которая фактически делает то же самое, что ты руками делал, и “думает” так же, как ты думал в тот момент, когда разбирал.

Это да, бессознательно я нахожу информацию очень быстро, вот теперь думаю как это правило передать в шаблон и исключить ошибочные данные. Обязательно отпишусь как придумаю алгоритм. Один из простых способов, который я для себя определил - это правило вхождения, для некоторых переменных, примерно так это может выглядеть:

 >>>A1porch = {'Y': None, 'N': None}
>>>if 'Porch' in P1:
......  A1porch['Y'] = 'Porch'
else: 
......  A1porch['N'] = 'No Porch'
>>>myfile = open(r'D:\python\a1.txt', 'w')
>>>if A1porch['N'] == None:
......	myfile.write('%s\t%s\n' % ('Exterior:', A1porch['Y']))
else:
......	myfile.write('%s\t%s\n' % ('Exterior:', A1porch['N']))
>>>>myfile.close()

В итоге имею строку в файле - Exterior: No Porch

Это я планирую для легких и хорошо известных случаев, где объекты либо присутствуют либо отсутствуют в строке.

Но тут одна проблема, к примеру в Exterior: я хотел бы иметь общую запись из одного списка. Пока додумался только до:

 >>> Exterior = []
>>> if 'Porch' in P1:
	Exterior.append('Porch')
>>> if 'Deck' in P1:
	Exterior.append('Deck')
>>> if 'Patio' in P1:
	Exterior.append('Patio')
>>> if 'Fenc' in P1:
	Exterior.append('Fence')
>>> myfile = open(r'D:\python\bpo\act.txt', 'w')
>>> myfile.write('%s\t%s\n' % ('Exterior:', Exterior[:]))
>>> myfile.close()

В итоге в файле получаю строку
 Exterior: ['Deck', 'Patio', 'Fence']
Пока не знаю как убрать скобки, оставив только значения. Или для этого лучше подойдет словарь ?

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

Офлайн

#4 Апрель 13, 2017 10:50:45

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

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

Acamori
Пока не знаю как убрать скобки, оставив только значения.
делайте join перед запистью
 >>> a=['1','2']
>>> str(a)
"['1', '2']"
>>> ','.join(a)
'1,2'



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Апрель 13, 2017 10:50:55)

Офлайн

#5 Апрель 13, 2017 11:04:07

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

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

PEHDOM
делайте join перед запистью
Спасибо ! Все гениальное - просто Буду теперь разбираться с модулем re для выборки более специфичных данных.

И просто вопрос на засыпку, возможно ли преобразовать только значения словарей ?

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

Офлайн

#6 Апрель 13, 2017 12:40:49

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

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

Acamori
возможно ли преобразовать только значения словарей ?
не совсем понял вопрос, так чтоли?
 >>> a={1:'One',2:'Two',3:'three'}
 >>> a
{1: 'One', 2: 'Two', 3: 'three'}
>>> a.values()
dict_values(['One', 'Two', 'three'])
>>> ', '.join(a.values())
'One, Two, three'
>>>



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#7 Апрель 13, 2017 13:52:28

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

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

PEHDOM
не совсем понял вопрос, так чтоли?
  >>> a={1:'One',2:'Two',3:'three'}
 >>> a
{1: 'One', 2: 'Two', 3: 'three'}
>>> a.values()
dict_values(['One', 'Two', 'three'])
>>> ', '.join(a.values())
'One, Two, three'
>>>

Да Не знал что с помощью .join можно так. Думал работает только со списками.

Офлайн

#8 Апрель 13, 2017 14:11:10

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

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

Acamori
Думал работает только со списками.
так dict.values() b возвращает список значений в словаре.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#9 Апрель 13, 2017 14:50:29

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

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

PEHDOM
так dict.values() b возвращает список значений в словаре.

Я когда экспериментировал с print(dict.values(a)) или к примеру print(a.values()), всегда смущал возврат:

 dict_values(['One', 'Two', 'three'])

А c .join не пробовал.

Офлайн

#10 Апрель 14, 2017 13:10:21

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

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

Решил апнуть темку, что б не создавать новую. Хотелось бы услышать мнение по поводу возможности оптимизации кода.

Все из тех же PDF будут вытягиваться цифровые значения в виде строк, оттуда удаляется ненужный символ ',' и с помощью .join они будут собираться/отправляться в виде строк дальше. Но появилась потребность в округлении значений.
Правило округление вполне простое 2345 = 2300, 2567 = 2600, 987 = 1000, 935 = 900

Моих знаний пока хватило для такого способа:

 >>>A = '1,356'
>>>Ab = list(A)
>>>if ',' in Ab:
	Ab.remove(',')
>>>if len(Ab) == 4:
	if int(Ab[1]) == 9:
		if int(Ab[2]) >= 5:
			Ab[0] = int(Ab[0]) + 1
			Ab[1] = '0'
			Ab[2] = '0'
			Ab[3] = '0'
			Ab[0] = str(Ab[0])
		else:
			Ab[2] = '0'
			Ab[3] = '0'
	else:
		if int(Ab[2]) >= 5:
			Ab[1] = int(Ab[1]) +1
			Ab[2] = '0'
			Ab[3] = '0'
			Ab[1] = str(Ab[1])
else:
	if len(Ab) == 3:
		if int(Ab[0]) == 9:
			if int(Ab[1]) >= 5:
				Ab[0] = int(Ab[0]) + 1
				Ab[1] = '0'
				Ab[2] = '0'
				Ab[0] = str(Ab[0])
			else:
				Ab[1] = '0'
				Ab[2] = '0'
		if int(Ab[1]) >= 5:
			Ab[0] = int(Ab[0]) + 1
			Ab[1] = '0'
			Ab[2] = '0'
			Ab[0] = str(Ab[0])
		else:
			Ab[1] = '0'
			Ab[2] = '0'
>>>A = ''.join(Ab)
'1400'

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

Поэтому не особо смущает получения списка по типу:
 >>>A = '978'
>>>Ab = list(A)
>>>if ',' in Ab:
	Ab.remove(',')
>>> if ...........
>>>Ab
'['10','0','0']
>>>A = ''.join(Ab)
>>>A
'1000'
Но есть ли альтернативные способы ?

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

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version