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)