Форум сайта python.su
0
Друзья
сам я любитель и в качестве любительского проекта написал программу для конвертации выписки Сбербанка по карте из формата PDF формат Excel.
Т.к. выписка в формате PDF никак не поддаётся машинной обработке
На моей выписке программа работает, но требуется дополнительное тестирование.
Кому интересно - попробуйте протестировать https://github.com/Ev2geny/Sberbank2Excel
Отредактировано Ev2geny (Янв. 24, 2020 12:50:16)
Офлайн
568
Ev2geny
Вы ждёте конструктивную критику кода или она вам не нужна?
Офлайн
0
FishHook
Ev2genyВы ждёте конструктивную критику кода или она вам не нужна?
Отредактировано Ev2geny (Янв. 24, 2020 15:28:29)
Офлайн
568
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)
Офлайн
0
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)
Офлайн
568
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Все программы строятся на этом принципе, только если вы не пишите на ассемблере.
предполагает, что одна функция получает на вход результаты работы другой.
Офлайн
0
FishHook,
спасибо за внимание.
Переписал, разбил всё на отдельные функции.
Посмотрите, так более читабельно? https://github.com/Ev2geny/Sberbank2Excel
Отредактировано Ev2geny (Янв. 24, 2020 21:02:17)
Офлайн
0
Здравствуйте! Мне как зеленому новичку интересно было посмотреть, что и как у Вас сделано. Мне интересно запускать программу из исходника, а не exe. В исходники бывает вкладывают файл зависимостей с указанием внешних библиотек или небольшую инструкцию по запуску проекта. Этого там я не нашел - буду пробовать с установкой pandas.
Скачал архив с бинарником и удивился - там куча библиотек и др., которые не используются в исходнике. В исходниках я видел только pandas и ст. библиотеку, а в “упаковку” вошел видимо весь набор библиотек, установленных глобально. Вероятно Вы не использовали virtualenv. Если так, рекомендую прочитать и проект оформлять в виртуальном окружении, исключительно с задействованными внешними библиотеками. Это сравнительно просто и применяется везде. В этом случае и exe-сборка у Вас должна получиться компактней и с тестированием у желающих трудностей не будет.
По поводу раздельного (вручную) распознавания foxit в текст. Это пожалуй слабое место, нельзя ли программно это сделать через интерфейс командной строки (если он есть) или через средства автоматизации? Может быть найдется бесплатная альтернатива, работающая из командной строки и без установки?
Про PEP8 тоже слышал, но руки не доходили его изучить - пожалуй возмусь. Вот его перевод.
По какому руководству/книге Вы изучали pandas?
Отредактировано mc-black (Янв. 29, 2020 20:42:13)
Офлайн
0
P.S. Пробовал установить на venv с Python 3.8 через pip, не вышло. Ищу причину, обновляюсь до Python 3.8.1 на всякий случай.
Офлайн
0
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)
Офлайн