Алгоритм сортировки недостающей информации в списке python - PullRequest
1 голос
/ 23 марта 2020

Я читаю файл PDF и преобразую страницы в изображения с использованием pdf2image после преобразования всех страниц в изображения. Я использую Opencv для извлечения определенной таблицы c из изображения, которое я использую с помощью общих методов обработки изображений, таких как преобразование изображение в оттенках серого и применяя к нему некоторую морфологическую операцию для получения таблицы.

Проблема, с которой я сталкиваюсь, заключается в том, что мой код не может прочитать все ячейки таблицы, иногда отсутствуют данные,

 #sort all the contours from top to bottom
(contours, boundingBoxes) = sort_contours(contours,method="top-to-bottom")
#crop all the boxes
idx = 0
for c in contours:
    x,y,w,h = cv2.boundingRect(c)
    if cv2.contourArea(c)<300000:    #(w > 80 and h > 20) and w > 3*h:
        idx += 1
        new_img = img[y:y+h, x:x+w]
        r = 1600/new_img.shape[1]
        dim = (1600,int(new_img.shape[0]*r))
        new_img = cv2.resize(new_img,dim)
        cv2.imwrite(str(idx) + '.png',new_img)
        #this function reads and returns text inside the cropped cell
        val = highlight_text(new_img)
        text.append(val)
text = list(filter(lambda x: x != " ", text))
os.chdir("..\\images_from_pdf")

return text

Теперь эта функция возвращает значение извлеченного текста из каждой ячейки в виде списка сверху вниз, т.е.

['**particulars**'.'zohaib ali','**Name**', '1234','**identity**']

В этом списке первое значение не имеет значения, поэтому я удаляю это. После этого я сортирую список таким образом, что оба значения меняются местами, т.е.

['**Name**','zohaib ali','**identity**','1234'] 

Теперь он точно в том формате, который мне нужен для хранения в словаре или json, но если он пропускает одиночное значение , весь порядок испорчен, и мне нужно снова отсортировать вещи, исходя из того, откуда было пропущено значение.

Ожидаемый результат:

Теперь я хочу отсортировать перечислить таким образом, чтобы я мог определить пропущенные значения из таблицы, но я не могу сделать это, я написал другую функцию для сортировки, но безрезультатно, пожалуйста, помогите

Представлять

import json
import re
def interchange_val(val):
  for i in range(0,len(val)-1,2):
    val[i],val[i+1] = val[i+1],val[i]
 return val

def make_dict(val_list:list, form_keys:list)->dict:

 test = [] #list to check the current values is either key or value if it is 
  a key then true else False
 i= 0 #counter for val_list 
 j= 0 #counter for form_keys
 val_dic = [] #final result after processing the list


'''
    This loop will iterate over the lists and if it found the form_key in 
    correct position in case of val_list i.e 
    1. Name and its value
    2. Identity and its value
    4 Amount and its value
    it will print [True,False,True,False,True,False]
    In case val_list_1 it will produce an output like
        [False,True,,False,True, True]
    In case val_list_2 it will produce an output like
        [True,False,False,False,True]

'''
 while i<len(val_list) and j<len(form_keys):
    print("inside loop")
    keyword = form_keys[j].split()
    print(keyword)
    search_words = val_list[i]
    print(search_words)
    word = re.compile(rf'\b{keyword[0]}\b',flags=re.I|re.X)
    y = re.findall(word,search_words)        
    print(y)
    if (i == 0) and (len(y)>=1):
        # val_dic.append("")
        test.append(True)
        # val_dic.append("")
        j += 1  
        i += 1
        continue
    elif (i == 0) and (len(y)==0):
        # val_dic.append("")
        test.append(False)
        # val_dic.append("")
        j += 1  
        i += 1
        continue
    elif (i>0) and (len(y)>=1):
        print("inside if")
        # val_dic.append("")
        test.append(True)
        i+=1
    # elif (i%2 == 1) and (len(y)>=2):

    #     # val_dic.append(val_list[i-1].upper())
    #     print("inside elif")    
    else:
        i+=1
        test.append(False)
        # if i == len(val_list) and j<len(val_list):
        #     i = 0
        #     j+=1
        #     test.append("")
        continue
    j += 1
 print(test)


'''
    Now this loop will try to assemble all the data using test as the condition
'''

 for i, val in enumerate(test):
    if (i==0) and (val == True) and (test[i+1] == False):
        val_dic.append(val_list[i+1])
        continue
    if (i==0) and (val == False):
        val_dic.append("")
        continue
    elif (i>1) and (val == False) and (test[i-1] == True):
        val_dic.append(val_list[i])
        continue
    elif (i>1) and (i<len(test)-1) and (val == False) and (test[i+1] == False):
        # test[i+1] = True
        # test[i+2] = False
        # # val_dic.`append(val_list[i+1])
        continue

    elif (i>1) and (i<len(test)-1) and (val == True) and (test[i+1] == True):
        val_dic.append("")
        continue    

 return val_dic


def main_func():
    #Correct Order of items
 val_list = ["particulars", "Zohaib Ali", "Name", "1234", "Identity", "24", "Amount"]

#Incorrect Order of Items the value of Name field has been missed during reading the data
 val_list_1 = ["particulars", "Name", "1234", "Identity", "24", "Amount"]


#Incorrect Order of Items the value of identity key  has been missed during reading the data
 val_list_2 = ["particulars","Zohaib", "Name", "1234", "24", "Amount"]


#keys that must be present in the form but might be missed during form reading
 form_keys = ["Name",
            "Identity",
            "Amount"]

 if val_list[0] == "particulars":
    val_list.remove(val_list[0])
    val = interchange_val(val_list)

 x = make_dict(val_list,form_keys)
 print(x)

if __name__ == "__main__":
 main_func()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...