# Extract text from scanned documents (JPG), output pdf version, classify documents based on text contents and rename pdf accordingly, then output csv

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
if "Bill number" in text:
file_type = "Bill"
elif "Reminder" in text:
file_type = "R2"
file_type = "W4"
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)