BG Development


  Reply to this topicStart new topicStart Poll

> Мнение за прост скрипт на Python
nfosdnfkanfjdsn
Публикувано на: 14-03-2022, 00:26
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 4
Регистриран на: 05.02.22



Здравейте,
за първи път ми се наложи да пиша код на Python и резултата е долу.
На прав път ли съм или не?

Инак като РНР кодер ми харесва питона, че на база indentation-а разбираш къде свършва иф-а или лооп-а. И най-вече няма нужда всичко да се затваря с ;


CODE
#!/usr/bin/env python
import pdfplumber
import os
import sys
import shutil
import mysql.connector

DB = mysql.connector.connect(
 host="localhost",
 user="root",
 password="",
 database="test"
)

dbcursor = DB.cursor()
pdf_file_path = sys.argv[1]
pdf_id = sys.argv[2]
pdf_file_path_check = os.path.exists(pdf_file_path)
img_folder = os.path.abspath(os.getcwd())
if pdf_file_path_check:
   img_folder_file = img_folder + "/pdf-images/" + str(pdf_id)
   img_folder_check = os.path.exists(img_folder_file)
   if not img_folder_check:
       os.makedirs(img_folder_file)
   else:
       shutil.rmtree(img_folder_file)
       os.makedirs(img_folder_file)
   with pdfplumber.open(pdf_file_path) as pdf:
       for index, item in enumerate(pdf.pages):
           img_name = str(img_folder_file) + "/img_" + str(index) + '.png'
           im = pdf.pages[index].to_image(resolution=150)
           im.save(img_name, format="PNG")
           sql = "INSERT INTO pdf_texts (pdf_id, pdf_text, page_number, pdf_image) VALUES (%s, %s, %s, %s)"
           val = (pdf_id, pdf.pages[index].extract_text(), index + 1, img_name)
           dbcursor.execute(sql, val)
       DB.commit()
else:
   sql = "INSERT INTO pdf_errors (pdf_id, file_type) VALUES (%s, %s)"
   val = (pdf_id, 1)
   dbcursor.execute(sql, val)
   DB.commit()
PMEmail Poster
Top
boundless
Публикувано на: 14-03-2022, 15:18
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 3
Регистриран на: 18.04.16



Кода изглежда наред, но ако искаш да се занимаваш повече с Python или това ти е нещо за работата (което ще се поддържа и променя с години) те съветвам да обърнеш внимание на следните моменти:

1. работиш с sys.argv, но никъде не го проверяваш колко параметра държи в себе си - потенциален краш. Ако искаш да е удобно на user-a провери argparse библиотеката.
2. Създаваш излишни променливи които само пречат на бързото четене на програмата (pdf_file_path_check, img_folder_check)
3. Използвай os.path.join вместо some_path = str1 + str2
4. Прекомерно използваш str(): pdf_id и img_folder_file са си стрингове
5. Използвай вече създадения item от enumerate-a вместо pdf.pages[index]
6. Хубаво е работата с DB и OC да е затворена с try..except block
PMEmail Poster
Top
nfosdnfkanfjdsn
Публикувано на: 14-03-2022, 19:27
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 4
Регистриран на: 05.02.22



QUOTE (boundless @ 14-03-2022, 15:18)
Кода изглежда наред, но ако искаш да се занимаваш повече с Python или това ти е нещо за работата (което ще се поддържа и променя с години) те съветвам да обърнеш внимание на следните моменти:

1. работиш с sys.argv, но никъде не го проверяваш колко параметра държи в себе си - потенциален краш. Ако искаш да е удобно на user-a провери argparse библиотеката.
2. Създаваш излишни променливи които само пречат на бързото четене на програмата (pdf_file_path_check, img_folder_check)
3. Използвай os.path.join вместо some_path = str1 + str2
4. Прекомерно използваш str(): pdf_id и img_folder_file са си стрингове
5. Използвай вече създадения item от enumerate-a вместо pdf.pages[index]
6. Хубаво е работата с DB и OC да е затворена с try..except block

Благодаря.
Ще обърна внимание на съветите ти и ще оправя кода.
Иначе съм поредния провинциален РНР мазач и това можех и на РНР да го напиша. Но от доста време искам да науча нещо ново и почнах с този скрипт.
PMEmail Poster
Top
CPPlus
Публикувано на: 16-03-2022, 17:15
Quote Post



Име: Людмил Григоров
Група: Потребител
Ранг: Почетен член

Мнения: 1118
Регистриран на: 22.06.11



Защо да пречат на четенето на кода променливите?

Да, аз бих преименувал pdf_file_path_check на pdf_exists ама без pdf_file_path как ще знаеш, че sys.argv[1] какво е без коректно именувана променлива?

Аз даже бих отишъл в екстремум с тея неща и бих изкарвал нещата в 4-5 редови методи само за да може да се чете като английски език програмата (изключвам performance код)


--------------------
Нищо не е свършило, докато не е свършило! Не се предавай и ще постигнеш целта си!
PMEmail Poster
Top
cilylu
Публикувано на: 17-03-2022, 16:23
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 2
Регистриран на: 14.03.22



CODE
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pdfplumber
import os
import sys
import shutil
import mysql.connector

DB = mysql.connector.connect(
host="localhost",
user="root",
password="",
database="",
use_unicode=True,
charset="utf8"
)

dbcursor = DB.cursor()
pdf_file_path = sys.argv[1]
pdf_id = sys.argv[2]
img_folder = os.path.abspath(os.getcwd())


if os.path.exists(pdf_file_path):
  img_folder_file = img_folder + "/pdf-images/" + pdf_id
  if not os.path.exists(img_folder_file):
      os.makedirs(img_folder_file)
  else:
      shutil.rmtree(img_folder_file)
      os.makedirs(img_folder_file)
      delete_sql = "DELETE FROM pdf_texts WHERE pdf_id = '%d'" % int(pdf_id)
      dbcursor.execute(delete_sql)
      DB.commit()
  with pdfplumber.open(pdf_file_path) as pdf:
      for index, item in enumerate(pdf.pages):
          pdf_text = item.extract_text()
          img_name = img_folder_file + "/img_" + str(index) + '.png'
          try:
              im = item.to_image(resolution=150)
              im.save(img_name, format="PNG")
          except:
              sql = "INSERT INTO pdf_errors (pdf_id, error_type, error_text) VALUES (%s, %s)"
              val = (pdf_id, 2, img_name)
              dbcursor.execute(sql, val)
              DB.commit()
          sql = "INSERT INTO pdf_texts (pdf_id, pdf_text, page_number, pdf_image) VALUES (%s, %s, %s, %s)"
          val = (pdf_id, pdf_text, index + 1, img_name)
          dbcursor.execute(sql, val)
      DB.commit()
      pdf.close()
      print(1)
else:
  sql = "INSERT INTO pdf_errors (pdf_id, error_type, error_text) VALUES (%s, %s, %s)"
  val = (pdf_id, 1, 'File error')
  dbcursor.execute(sql, val)
  DB.commit()
  print(2)


до тук го докарах, но още не съм го тествал как се справя в реална среда, че сървъра има само питон 2.*...
PMEmail Poster
Top
boundless
Публикувано на: 17-03-2022, 19:34
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 3
Регистриран на: 18.04.16



QUOTE (CPPlus @ 16-03-2022, 17:15)
Защо да пречат на четенето на кода променливите?

Да, аз бих преименувал pdf_file_path_check на pdf_exists ама без pdf_file_path как ще знаеш, че sys.argv[1] какво е без коректно именувана променлива?

Аз даже бих отишъл в екстремум с тея неща и бих изкарвал нещата в 4-5 редови методи само за да може да се чете като английски език програмата (изключвам performance код)

Аз съм написал че pdf_file_path_check е излишна, а ти коментираш pdf_file_path, която очевидно не е излишна. Важното е че човека ме е разбрал и в новата си версия ги е махнал.
PMEmail Poster
Top
boundless
Публикувано на: 17-03-2022, 19:53
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 3
Регистриран на: 18.04.16



От нещата които си променил само try..except може да се развие повече.
Знам че е много лесно и бързо да хванеш само с обикновен except евентуален проблем, но е лоша практика.
Но дори и ако не решиш да напишеш специфичния/специфичните Exceptions за дадения код поне си принтирай хванатия проблем в конзолата или в лог файл за да знаеш защо се е появил нов запис в pdf_errors.

Аз бих затворил в try..except блок и db.connect и db.execute.

И между другото по някое време ще почнеш да се чудиш какво значи в ДБ-то error_type 1 i 2 (magic numbers). Използвай константи най-отгоре в скрипта ти за такива числа така че да не ти се налага да го четеш целия после за да разбереш какво точно беше грешка 1 или 2. (А и със сигурност по някое време ще се появят и error_types 3 и 4...)
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0