Artur Rakhmatulin
Anonymous
То есть у вас не так. Ок буду искать
Pavel
Tigran
Artur Rakhmatulin
я думаю это конкурс на самое неоптимальное решение
Artur Rakhmatulin
надо одним потоком сохранять в гугл таблицах, а другим читать 🤔
Nikolay
Tigran
🤦♂️
Loadi
Pavel
странных решений контест :)
Aleksey
Крч , умников всегда больше чем решений )
Nodaa
Pavel
есть еще Counter, кстати
Nodaa
Nodaa
json же
Nodaa
это не Чел пишет криво
Tigran
ну и?
Tigran
.count('type') не работает
Tigran
ответ очевиден, твоё решение неправильное и надо сделать по-другому
Tigran
но через re тоже корректно не сделаешь.
Tigran
надо парсить json парсером json и идти циклом
.
Вопрос не по Пайтону, но надеюсь на вашу помощь. Подскажите по структуре:
есть посты, к которым могут прикрепляться файлы, которые можно просматривать с информацией об их размере, оригинальном имени и саму ссылку на файл. Файлы само собой можно прикреплять при создании поста, при его редактировании можно и добавлять и удалять привязанные файлы.
Сейчас это реализовано так: есть API метод files.upload, через который загружается файл, в результате файл загружается в хранилище а в базе создается запись с метаданными файла и ему выдается айдишник. Полученные айдишники файлов можно передать при создании/редактировании поста в виде массива айдишников. В результате чего будет созданы записи в отделную таблицу attachments со связью в виде post_id - file_id. При получении поста, таблица attachments джоинится с таблицей файлов по ключу file_id для получения метаданных прикрепленных файлов. При удалении прикрепленного файла, вызывается метод attachments.delete, который удаляет запись из таблицы attachments.
Нормальный вариант? Или есть получше?
files.upload также используется для загрузки каких либо других файлов на сайте (фото профайла, аватарка группы, и т.д.)
Tigran
Нормальный вариант, а разве видны какие-то проблемы?
Не упомянута только чистка хранилища при удалении метаданных.
Anonymous
Anonymous
Pavel
Жить она еще будет долго.
я не спорю. некоторые люди до сих пор под 2.6 ядро модули пишут, например. так что и второму питону еще долго где-то присутствовать ничего не помешает
Nodaa
Tigran
ломается на "type": ":type:: "
Dima
Ты настаиваешь на своем? Говорят, хорошо настаивать на клюкве
Tigran
Зачем отстаивать своё хуёвое решение с регулярками, когда можно просто распарсить JSON?
Artur Rakhmatulin
import json; import re; my_json = {"sizes": [{"type": "s",},{"type": "m",}]}; print(len(re.findall('(\{\"type\"\:\s*\"\w+\"\}\,{0,1})', json.dumps(my_json))))
Vladimir
Регулярки для разбора JSON — это божественная херота
Tigran
Anonymous
Nodaa
Не хотите Как хотите
Dima
Sergey
Сейчас пишу код для распознавания таблиц и их содержимого в отсканированных документах (на вход pdf, на выход json со строками и столбцами таблицы). Текущий подход - обнаружение контуров, вырезание ячеек как отдельных изображений и прогон через тессеракт. Проблема в том, что иногда даже после предобработки таблицы обрабатываются либо скошенными, либо с нерегулярными разделительными линиями, что нарушает порядок при использовании текущего метода сортировки ячеек (лист 1 до N, где потом тессеракт обнаруживает текстовые поля и принимает их за заголовки колонок, которые заполняются содержимым ячеек между заголовочными)
Вот код используемой сейчас сортировки сверху вниз, слева направо
def sort_rect_vertical(cnts):
rect = [cv2.boundingRect(c) for c in cnts]
rect.sort(key=lambda b: b[1])
line_bottom = rect[0][1]+rect[0][3]-1
line_begin_idx = 0
for i in xrange(len(rect)):
if rect[i][1] > line_bottom:
rect[line_begin_idx:i] = sorted(rect[line_begin_idx:i], key=lambda b: b[0])
line_begin_idx = i
line_bottom = max(rect[i][1]+rect[i][3]-1, line_bottom)
rect[line_begin_idx:] = sorted(rect[line_begin_idx:], key=lambda b: b[0])
Мне хотелось бы спросить, как лучше доработать этот код для расфасовывания ячеек по столбцам.
Savva
Сейчас пишу код для распознавания таблиц и их содержимого в отсканированных документах (на вход pdf, на выход json со строками и столбцами таблицы). Текущий подход - обнаружение контуров, вырезание ячеек как отдельных изображений и прогон через тессеракт. Проблема в том, что иногда даже после предобработки таблицы обрабатываются либо скошенными, либо с нерегулярными разделительными линиями, что нарушает порядок при использовании текущего метода сортировки ячеек (лист 1 до N, где потом тессеракт обнаруживает текстовые поля и принимает их за заголовки колонок, которые заполняются содержимым ячеек между заголовочными)
Вот код используемой сейчас сортировки сверху вниз, слева направо
def sort_rect_vertical(cnts):
rect = [cv2.boundingRect(c) for c in cnts]
rect.sort(key=lambda b: b[1])
line_bottom = rect[0][1]+rect[0][3]-1
line_begin_idx = 0
for i in xrange(len(rect)):
if rect[i][1] > line_bottom:
rect[line_begin_idx:i] = sorted(rect[line_begin_idx:i], key=lambda b: b[0])
line_begin_idx = i
line_bottom = max(rect[i][1]+rect[i][3]-1, line_bottom)
rect[line_begin_idx:] = sorted(rect[line_begin_idx:], key=lambda b: b[0])
Мне хотелось бы спросить, как лучше доработать этот код для расфасовывания ячеек по столбцам.
На pastebin залей или пришли фоткой
Savva
Pavel
Pavel
это самый плохой способ
Savva
Сейчас пишу код для распознавания таблиц и их содержимого в отсканированных документах (на вход pdf, на выход json со строками и столбцами таблицы). Текущий подход - обнаружение контуров, вырезание ячеек как отдельных изображений и прогон через тессеракт. Проблема в том, что иногда даже после предобработки таблицы обрабатываются либо скошенными, либо с нерегулярными разделительными линиями, что нарушает порядок при использовании текущего метода сортировки ячеек (лист 1 до N, где потом тессеракт обнаруживает текстовые поля и принимает их за заголовки колонок, которые заполняются содержимым ячеек между заголовочными)
Вот код используемой сейчас сортировки сверху вниз, слева направо
def sort_rect_vertical(cnts):
rect = [cv2.boundingRect(c) for c in cnts]
rect.sort(key=lambda b: b[1])
line_bottom = rect[0][1]+rect[0][3]-1
line_begin_idx = 0
for i in xrange(len(rect)):
if rect[i][1] > line_bottom:
rect[line_begin_idx:i] = sorted(rect[line_begin_idx:i], key=lambda b: b[0])
line_begin_idx = i
line_bottom = max(rect[i][1]+rect[i][3]-1, line_bottom)
rect[line_begin_idx:] = sorted(rect[line_begin_idx:], key=lambda b: b[0])
Мне хотелось бы спросить, как лучше доработать этот код для расфасовывания ячеек по столбцам.
Скрин во всяком случае лучше этого
Pavel
Savva
С той, что на фотке и код подсвечивается, таббуляция не сбита и строки не переносятся
Sergey
Сейчас отскриню.
Pavel
Tigran
(facepalm)
Измельчали разработчики, без подсветки не могут!
Sergey
Denis
Подскажите по Pyqt.
Нужно сделать что-то на подобии как на скрине. Только со следующим функционалом: итемы добавляются автоматически, у них разная ширина. Нужно сделать что бы при достаточно большом количестве этих итемов или при длинном основном тексте появлялся скрол внизу виджета, а не под итемами, так сказать был общим для всех итемов и основного текста
Anonymous
есть список в котором описаны прямоугольники, некоторые из них накладываются друг на друга
нужно выписать координаты мест где есть прямоугольники
как это сделать?
Anonymous
Aragaer
а что сделать, если бы был прямоугольник, накрывающий левую нижнюю точку верхней группы и правую верхнюю нижней?
Pavel
Pavel
мультиполигон что ли?
Pavel
гугли по словам geomety; unary_union
Pavel
Pavel
какие-то требования к решению предъявляются? если нет, бери shapely и вперед :)
Pavel
или тебе bounding box'ы пересекающихся групп нужны (картинка на это намекает)
Дмитрий
Хочу начать внедряться в питон.
Какая иде лучше полноценная visual studio или pycharm?
Главные требования это отладка, intellisense
Anonymous
Ivan
Pavel
я плохо объясняю) надо как на картинке
ну смотри. если с нуля делать, тебе нужно:
1. выделять группы прямоугольников, которые пересекаются
2. находить для них ббоксы
есть библиотека shapely, в которой этот функционал есть.
но вообще это совершенно базовая геометрия и её несложно написать самостоятельно
Sergey
В дополнение к своему вопросу выше: сейчас есть идея обнаружить горизонтальные разделительные линии и нарезать изображение на фрагменты, заключенные между их парами, а только потом уже нашинковать строки на ячейки. Вопрос в том, как это можно сделать, если а) изображение слегка повернуто и б) справа/слева от большинства горизонтальных линий есть вайтспейс.
Sergey
Пример таблицы (без содержимого ячеек). Тут уже был проведен препроцессинг.
Дмитрий
pycharm
в чем у него преимущества по сравнению со студией? Мне он показался очень тормазнутым