Форум сайта python.su
Друзья
сам я любитель и в качестве любительского проекта написал программу для конвертации выписки Сбербанка по карте из формата PDF формат Excel.
Т.к. выписка в формате PDF никак не поддаётся машинной обработке
На моей выписке программа работает, но требуется дополнительное тестирование.
Кому интересно - попробуйте протестировать https://github.com/Ev2geny/Sberbank2Excel
Отредактировано Ev2geny (Янв. 24, 2020 12:50:16)
Офлайн
Ev2geny
Вы ждёте конструктивную критику кода или она вам не нужна?
Офлайн
FishHook
Ev2genyВы ждёте конструктивную критику кода или она вам не нужна?
Отредактировано Ev2geny (Янв. 24, 2020 15:28:29)
Офлайн
Ev2geny
Мне, признаться, совершенно плевать на выписки из сбербанка, а вот код мне интересен. Я не буду комментировать каждую вашу строку и докапываться до запятых, но несколько общих замечаний я сделать должен. Если вы в свою очередь тоже хотите стать профессионалом, вы прислушаетесь к моим рекомендациям.
Итак, что тут важно:
1) Ваш код нарушает один из главных принципов хорошего кода - принцип единичной ответственности. Ваша функция sberbankPDFtext2Excel делает всё и сразу. Это очень плохо по многим причинам. Такой код: трудно читать, трудно отлаживать и тестировать, трудно поддерживать.
Сравните два подхода:
def doAll(): ... # стопицот строк if __name__ == '__main__': doAll()
if __name__ == '__main__': input_file_name = sys.argv[1] output_file_name = sys.argv[2] raw_data = read_data(file_name) parsed_data = parse_data(data) ... save_data(output_file_name)
Офлайн
FishHook,
спасибо, что потратили время. Скажу честно, никогда ни один профессионал не комментировал мой код, польщён.
Но есть вопросы.
FishHook
Ваша функция sberbankPDFtext2Excel делает всё и сразу
if __name__ == '__main__': input_file_name = sys.argv[1] output_file_name = sys.argv[2] raw_data = read_data(file_name) parsed_data = parse_data(data) ... save_data(output_file_name)
FishHook
Есть документ PEP8 - который любой питонист должен знать наизусть. Он декларирует стиль программы, это на самом деле очень важно.
Отредактировано Ev2geny (Янв. 24, 2020 18:43:05)
Офлайн
Ev2genyНет. Сделайте вот так
Таким образом мне нужна именно одна функция, которая выполняет весь функционал.
def run(): input_file_name = sys.argv[1] output_file_name = sys.argv[2] raw_data = read_data(file_name) parsed_data = parse_data(data) ... save_data(output_file_name)
parser = Parser() data = parser.parse() transformer = Transformer() transformed_data = transformer(data) saver = Saver() saver.save_data(transformed_data )
result['operation_date']=line_parts[0] result['description']=line_parts[1] result['value_account_currency']=utils.get_float_from_money(line_parts[2],True) result['remainder_account_currency']=utils.get_float_from_money(line_parts[3]) #************* looking at lines between 1st and the last sublines=lines[1:-1] for line in sublines: line_parts=utils.split_Sberbank_line(line) if len(line_parts)!=1: raise exceptions.SberbankPDFtext2ExcelError("Line is expected to have only one part :"+line) result['description']=result['description']+' '+line_parts[0]
Ev2geny
Для вашего подхода нужна функциональность глобальных переменных, значит надо будет делать объект, а это муторно.
Ev2genyВсе программы строятся на этом принципе, только если вы не пишите на ассемблере.
предполагает, что одна функция получает на вход результаты работы другой.
Офлайн
FishHook,
спасибо за внимание.
Переписал, разбил всё на отдельные функции.
Посмотрите, так более читабельно? https://github.com/Ev2geny/Sberbank2Excel
Отредактировано Ev2geny (Янв. 24, 2020 21:02:17)
Офлайн
Здравствуйте! Мне как зеленому новичку интересно было посмотреть, что и как у Вас сделано. Мне интересно запускать программу из исходника, а не exe. В исходники бывает вкладывают файл зависимостей с указанием внешних библиотек или небольшую инструкцию по запуску проекта. Этого там я не нашел - буду пробовать с установкой pandas.
Скачал архив с бинарником и удивился - там куча библиотек и др., которые не используются в исходнике. В исходниках я видел только pandas и ст. библиотеку, а в “упаковку” вошел видимо весь набор библиотек, установленных глобально. Вероятно Вы не использовали virtualenv. Если так, рекомендую прочитать и проект оформлять в виртуальном окружении, исключительно с задействованными внешними библиотеками. Это сравнительно просто и применяется везде. В этом случае и exe-сборка у Вас должна получиться компактней и с тестированием у желающих трудностей не будет.
По поводу раздельного (вручную) распознавания foxit в текст. Это пожалуй слабое место, нельзя ли программно это сделать через интерфейс командной строки (если он есть) или через средства автоматизации? Может быть найдется бесплатная альтернатива, работающая из командной строки и без установки?
Про PEP8 тоже слышал, но руки не доходили его изучить - пожалуй возмусь. Вот его перевод.
По какому руководству/книге Вы изучали pandas?
Отредактировано mc-black (Янв. 29, 2020 20:42:13)
Офлайн
P.S. Пробовал установить на venv с Python 3.8 через pip, не вышло. Ищу причину, обновляюсь до Python 3.8.1 на всякий случай.
Офлайн
mc-blackНе думаю, что virtualenv что-то изменит, по описанию pyinstaller подтягивает только те библиотеки, которые нужны. То что Вы думаете лишнее думаю используется в свою очередь pandas или tkinter. Но можно попробовать.
Скачал архив с бинарником и удивился - там куча библиотек и др., которые не используются в исходнике. В исходниках я видел только pandas и ст. библиотеку, а в “упаковку” вошел видимо весь набор библиотек, установленных глобально. Вероятно Вы не использовали virtualenv. Если так, рекомендую прочитать и проект оформлять в виртуальном окружении, исключительно с задействованными внешними библиотеками. Это сравнительно просто и применяется везде. В этом случае и exe-сборка у Вас должна получиться компактней и с тестированием у желающих трудностей не будет.
mc-blackНе нашёл ни нормальной библиотеки для питона ни бесплатной утилиты которая делала бы это с командной строки. Но может просто плохо искал
Может быть найдется бесплатная альтернатива, работающая из командной строки и без установки?
mc-blackСпасибо, но советую читать на английском. Количество и качество информации на английском не сравнимо с русским (я не обязательно про PEP8. а вообще по питону).
Про PEP8 тоже слышал, но руки не доходили его изучить - пожалуй возмусь. Вот его перевод.
mc-blackhttps://www.youtube.com/watch?v=ZyhVh-qRZPA
По какому руководству/книге Вы изучали pandas?
Отредактировано Ev2geny (Янв. 30, 2020 16:31:49)
Офлайн