3
\$\begingroup\$

I would like to get some feedback on the below python code.

It works correctly when run, but I am concerned about efficiency as it's not the fastest to run and also about whether I should be using a with open statement.

Any feedback would be greatly appreciated as this is the first time I've written something like this.

import string  # To clean up strings extracted from images.
import cv2  # To read  JPG images for tesseract.
import pytesseract  # OCR to extract text from image read by OpenCV cv2.
import glob  # To iterate over all JPG files in a directory.
from datetime import datetime  # Handles dates, to parse dates from string and to return todays date.
import pandas  # To create dataframe from lists and then a csv from the dataframe.
from PIL import Image  # To convert image to PDF.
import os  # For renaming files.

# path to tesseract, this is necessary to avoid complicated installation.
pytesseract.pytesseract.tesseract_cmd = r"C:\Users\Anthony.Fox\AppData\Local\Programs\Tesseract-OCR\tesseract.exe"

# This lists are appended at each stage of file processing and then become the columns in the exported csv
csv_account_number = []
csv_doc_date = []
csv_file_type = []
csv_file_name = []
# Empty string variables to be amended at each stage of file processing before being appended to above lists.
file_type = ""
dates = ""
account_number = ""

pdf_counter = 1
# path the folder containing scanned images, this is also the output folder for pdfs for bot and csv for reporting
MYPATH = r"path_to_directory_containing_jpgs"

for file in glob.glob(MYPATH + "/*.jpg"):
    text = f"{pytesseract.image_to_string(cv2.imread(file))}"  # Extract text from image
    text1 = text.splitlines()  # Split text into lines
    image = Image.open(file).convert('RGB').save(f"{MYPATH}\\{pdf_counter}.pdf")  # Save a pdf version of the image
    if "Bill number" in text:
        file_type = "Bill"
    elif "Reminder" in text:
        file_type = "R2"
    elif "Your home will soon be powered by green energy" in text:
        file_type = "W4"
    elif "Your new home is powered by green energy" in text:
        file_type = "W5"
    else:
        file_type = "Letter"
    for line in text1:
        line_search = line.lower()
        if "account number" in line_search:
            # remove spaces and punctuation from line leaving account number
            account_number = line_search[16:].translate(str.maketrans('', '', string.punctuation))
            # print(account_number)
            csv_account_number.append(account_number)
            # Break as the account numbers are at the top of the document we don't want to continue once the
            # account number has been found.
            break
    for line in text1:
        if "Date" in line:
            # Remove spaces, words, and punctuation from text line, leaving just the date, which is then parsed.
            dates = str(datetime.strptime(line.split("Date")[-1].split(' ', 1)[-1].
                                          translate(str.maketrans('', '', string.punctuation)), '%d %B %Y'))[:-9]
            csv_doc_date.append(dates)
            # print(dates)
            # Break as the date is at the top of the document we don't want to continue once the
            # date has been found.
            break
    csv_file_type.append(file_type)
    filename = f"{dates}_{file_type}_file_{pdf_counter}"
    csv_file_name.append(filename)
    os.rename(f"{MYPATH}\\{pdf_counter}.pdf", f"{MYPATH}\\{filename}.pdf")
    pdf_counter += 1

# Create a dataframe from the lists amended at each stage of file processing.
df = pandas.DataFrame(data={'Account Number': csv_account_number, 'Document Date': csv_doc_date,
                            'File Type': csv_file_type, 'File Name': csv_file_name})
# Create a csv in MYPATH from above data frame named with todays date.
df.to_csv(f"{MYPATH}\\File_Data_exported_{datetime.today().strftime('%d-%m-%Y')}.csv", sep=',', index=False)

# Prints to verify that each stage is working correctly.
print(csv_file_type)
print(csv_account_number)
print(csv_doc_date)
print(csv_file_name)
print(df)
\$\endgroup\$

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.