最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解如何通過Python實(shí)現(xiàn)批量數(shù)據(jù)提取

 更新時(shí)間:2023年03月21日 09:58:41   作者:ncq的小舔狗  
每天面對(duì)成堆的發(fā)票,無論是發(fā)票還是承兌單據(jù),抑或是其他各類公司數(shù)據(jù)要從照片、PDF等不同格式的內(nèi)容中提取,我們都有必要進(jìn)行快速辦公的能力提升。本文就教你如何利用Python實(shí)現(xiàn)批量數(shù)據(jù)提取吧

每天面對(duì)成堆的發(fā)票,無論是發(fā)票還是承兌單據(jù),抑或是其他各類公司數(shù)據(jù)要從照片、PDF等不同格式的內(nèi)容中提取,我們都有必要進(jìn)行快速辦公的能力提升。

因此,我們的目標(biāo)要求就十分明顯了,首先要從圖片中獲取數(shù)據(jù),其次將數(shù)據(jù)統(tǒng)一導(dǎo)入到EXCEL中。

配置需求

1.ImageMagick  

2.tesseract-OCR 

3.Python3.7

4.from PIL import Image as PI

5.import io

6.import os

7.import pyocr.builders

8.from cnocr import CnOcr

9.import xlwt

分析上圖發(fā)現(xiàn)票據(jù)金額為“貳拾萬元整”,數(shù)據(jù)金額為大寫中文,因此在導(dǎo)入Excel之前我們需要將金額票據(jù)的數(shù)據(jù)轉(zhuǎn)換成數(shù)字的格式,基于此,我們需要首先完成大寫漢字和數(shù)字的轉(zhuǎn)換。

def chineseNumber2Int(strNum: str):
    result = 0
    temp = 1  # 存放一個(gè)單位的數(shù)字如:十萬
    count = 0  # 判斷是否有chArr
    cnArr = ['壹', '貳', '叁', '肆', '伍', '陸', '柒', '捌', '玖']
    chArr = ['拾', '佰', '仟', '萬', '億']
    for i in range(len(strNum)):
        b = True
        c = strNum[i]
        for j in range(len(cnArr)):
            if c == cnArr[j]:
                if count != 0:
                    result += temp
                    count = 0
                temp = j + 1
                b = False
                break
        if b:
            for j in range(len(chArr)):
                if c == chArr[j]:
                    if j == 0:
                        temp *= 10
                    elif j == 1:
                        temp *= 100
                    elif j == 2:
                        temp *= 1000
                    elif j == 3:
                        temp *= 10000
                    elif j == 4:
                        temp *= 100000000
                count += 1
        if i == len(strNum) - 1:
            result += temp
    return result

通過上述代碼即可實(shí)現(xiàn)大寫字母與數(shù)字的轉(zhuǎn)換,例如輸入“貳拾萬元整”即可導(dǎo)出“200000”,再將其轉(zhuǎn)換成數(shù)字后即可極大地簡(jiǎn)化表格的操作,也可以在完成表格操作的同時(shí)有利于數(shù)據(jù)歸檔。

接下來,我們需要分析發(fā)票的內(nèi)部?jī)?nèi)容,分析下圖可知,我們需要獲取以下幾個(gè)數(shù)據(jù)內(nèi)容:“出票日期”、“匯票到賬日期”、“票據(jù)號(hào)碼”、“收款人”、“票據(jù)金額”、“出票人”,可以通過畫圖軟件獲取精準(zhǔn)定位。

如圖,小黑點(diǎn)即鼠標(biāo)所在地,畫圖軟件左下角即他的坐標(biāo)。

提取出票日期

def text1(new_img):
    #提取出票日期
    left = 80
    top = 143
    right = 162
    bottom = 162
    image_text1 = new_img.crop((left, top, right, bottom))
    #展示圖片
    #image_text1.show()
    txt1 = tool.image_to_string(image_text1)
    print(txt1)
    return str(txt1)

提取金額

def text2(new_img):
    #提取金額
    left = 224
    top = 355
    right = 585
    bottom = 380
    image_text2 = new_img.crop((left, top, right, bottom))
    #展示圖片
    #image_text2.show()
    image_text2.save("img/tmp.png")
    temp = ocr.ocr("img/tmp.png")
    temp="".join(temp[0])
    txt2=chineseNumber2Int(temp)
    print(txt2)
    return txt2

提取出票人

def text3(new_img):
    #提取出票人
    left = 177
    top = 207
    right = 506
    bottom = 231
    image_text3 = new_img.crop((left, top, right, bottom))
    #展示圖片
    #image_text3.show()
    image_text3.save("img/tmp.png")
    temp = ocr.ocr("img/tmp.png")
    txt3="".join(temp[0])
    print(txt3)
    return txt3

提取付款行

def text4(new_img):
    #提取付款行
    left = 177
    top = 274
    right = 492
    bottom = 311
    image_text4 = new_img.crop((left, top, right, bottom))
    #展示圖片
    #image_text4.show()
    image_text4.save("img/tmp.png")
    temp = ocr.ocr("img/tmp.png")
    txt4="".join(temp[0])
    print(txt4)
    return txt4

提取匯票到賬日期

def text5(new_img):
    #提取匯票到日期
    left = 92
    top = 166
    right = 176
    bottom = 184
    image_text5 = new_img.crop((left, top, right, bottom))
    #展示圖片
    #image_text5.show()
    txt5 = tool.image_to_string(image_text5)
    print(txt5)
    return txt5

提取票據(jù)單據(jù)

def text6(new_img):
    #提取票據(jù)號(hào)碼
    left = 598
    top = 166
    right = 870
    bottom = 182
    image_text6 = new_img.crop((left, top, right, bottom))
    #展示圖片
    #image_text6.show()
    txt6 = tool.image_to_string(image_text6)
    print(txt6)
    return txt6

在將數(shù)據(jù)全部提取完成之后,即進(jìn)入設(shè)置環(huán)節(jié),我們需要首先將所有賬單文件進(jìn)行提取,獲取他們的文件名和路徑。

ocr=CnOcr()
tool = pyocr.get_available_tools()[0]
filePath='img'
img_name=[]
for i,j,name in os.walk(filePath):
    img_name=name

在獲取完整后,即可進(jìn)行數(shù)據(jù)導(dǎo)入Excel的操作。

count=1
book = xlwt.Workbook(encoding='utf-8',style_compression=0)
sheet = book.add_sheet('test',cell_overwrite_ok=True)
for i in img_name:
    img_url = filePath+"/"+i
    with open(img_url, 'rb') as f:
        a = f.read()
    new_img = PI.open(io.BytesIO(a))
    ## 寫入csv
    col = ('年份','出票日期','金額','出票人','付款行全稱','匯票到日期','備注')
    for j in range(0,7):
        sheet.write(0,j,col[j])
    book.save('1.csv')
    shijian=text1(new_img)
    sheet.write(count,0,shijian[0:4])
    sheet.write(count,1,shijian[5:])
    sheet.write(count,2,text2(new_img))
    sheet.write(count,3,text3(new_img))
    sheet.write(count,4,text4(new_img))
    sheet.write(count,5,text5(new_img))
    sheet.write(count,6,text6(new_img))
    count = count + 1

至此,完整流程結(jié)束。

附上源碼全部

from  wand.image import  Image
from PIL import Image as PI
import pyocr
import io
import re
import os
import shutil
import pyocr.builders
from cnocr import CnOcr
import requests
import xlrd
import xlwt
from openpyxl import load_workbook
 
def chineseNumber2Int(strNum: str):
    result = 0
    temp = 1  # 存放一個(gè)單位的數(shù)字如:十萬
    count = 0  # 判斷是否有chArr
    cnArr = ['壹', '貳', '叁', '肆', '伍', '陸', '柒', '捌', '玖']
    chArr = ['拾', '佰', '仟', '萬', '億']
    for i in range(len(strNum)):
        b = True
        c = strNum[i]
        for j in range(len(cnArr)):
            if c == cnArr[j]:
                if count != 0:
                    result += temp
                    count = 0
                temp = j + 1
                b = False
                break
        if b:
            for j in range(len(chArr)):
                if c == chArr[j]:
                    if j == 0:
                        temp *= 10
                    elif j == 1:
                        temp *= 100
                    elif j == 2:
                        temp *= 1000
                    elif j == 3:
                        temp *= 10000
                    elif j == 4:
                        temp *= 100000000
                count += 1
        if i == len(strNum) - 1:
            result += temp
    return result
 
 
def text1(new_img):
    #提取出票日期
 
    left = 80
    top = 143
    right = 162
    bottom = 162
    image_text1 = new_img.crop((left, top, right, bottom))
    #展示圖片
    #image_text1.show()
    txt1 = tool.image_to_string(image_text1)
 
    print(txt1)
    return str(txt1)
def text2(new_img):
    #提取金額
 
    left = 224
    top = 355
    right = 585
    bottom = 380
    image_text2 = new_img.crop((left, top, right, bottom))
    #展示圖片
    #image_text2.show()
    image_text2.save("img/tmp.png")
 
    temp = ocr.ocr("img/tmp.png")
 
    temp="".join(temp[0])
    txt2=chineseNumber2Int(temp)
    print(txt2)
 
    return txt2
 
def text3(new_img):
    #提取出票人
 
    left = 177
    top = 207
    right = 506
    bottom = 231
    image_text3 = new_img.crop((left, top, right, bottom))
    #展示圖片
    #image_text3.show()
    image_text3.save("img/tmp.png")
 
    temp = ocr.ocr("img/tmp.png")
    txt3="".join(temp[0])
 
    print(txt3)
    return txt3
def text4(new_img):
    #提取付款行
 
    left = 177
    top = 274
    right = 492
    bottom = 311
    image_text4 = new_img.crop((left, top, right, bottom))
    #展示圖片
    #image_text4.show()
    image_text4.save("img/tmp.png")
 
    temp = ocr.ocr("img/tmp.png")
    txt4="".join(temp[0])
 
    print(txt4)
    return txt4
def text5(new_img):
    #提取匯票到日期
 
    left = 92
    top = 166
    right = 176
    bottom = 184
    image_text5 = new_img.crop((left, top, right, bottom))
    #展示圖片
    #image_text5.show()
    txt5 = tool.image_to_string(image_text5)
 
    print(txt5)
    return txt5
def text6(new_img):
    #提取票據(jù)號(hào)碼
 
    left = 598
    top = 166
    right = 870
    bottom = 182
    image_text6 = new_img.crop((left, top, right, bottom))
    #展示圖片
    #image_text6.show()
    txt6 = tool.image_to_string(image_text6)
 
    print(txt6)
    return txt6
 
 
 
ocr=CnOcr()
 
tool = pyocr.get_available_tools()[0]
 
filePath='img'
img_name=[]
for i,j,name in os.walk(filePath):
    img_name=name
count=1
 
book = xlwt.Workbook(encoding='utf-8',style_compression=0)
sheet = book.add_sheet('test',cell_overwrite_ok=True)
 
for i in img_name:
    img_url = filePath+"/"+i
    with open(img_url, 'rb') as f:
        a = f.read()
    new_img = PI.open(io.BytesIO(a))
    ## 寫入csv
    col = ('年份','出票日期','金額','出票人','付款行全稱','匯票到日期','備注')
    for j in range(0,7):
        sheet.write(0,j,col[j])
    book.save('1.csv')
    shijian=text1(new_img)
    sheet.write(count,0,shijian[0:4])
    sheet.write(count,1,shijian[5:])
    sheet.write(count,2,text2(new_img))
    sheet.write(count,3,text3(new_img))
    sheet.write(count,4,text4(new_img))
    sheet.write(count,5,text5(new_img))
    sheet.write(count,6,text6(new_img))
    count = count + 1

以上就是詳解如何通過Python實(shí)現(xiàn)批量數(shù)據(jù)提取的詳細(xì)內(nèi)容,更多關(guān)于Python批量數(shù)據(jù)提取的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python操作Oracle數(shù)據(jù)庫(kù)的簡(jiǎn)單方法和封裝類實(shí)例

    Python操作Oracle數(shù)據(jù)庫(kù)的簡(jiǎn)單方法和封裝類實(shí)例

    這篇文章主要介紹了Python操作Oracle數(shù)據(jù)庫(kù)的簡(jiǎn)單方法和封裝類,結(jié)合實(shí)例形式分析了Python簡(jiǎn)單連接、查詢、關(guān)閉Oracle數(shù)據(jù)庫(kù)基本操作,并給出了一個(gè)Python針對(duì)Oracle各種操作的封裝類,需要的朋友可以參考下
    2018-05-05
  • python調(diào)用matlab的m自定義函數(shù)方法

    python調(diào)用matlab的m自定義函數(shù)方法

    今天小編就為大家分享一篇python調(diào)用matlab的m自定義函數(shù)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • Python實(shí)現(xiàn)從多表格中隨機(jī)抽取數(shù)據(jù)

    Python實(shí)現(xiàn)從多表格中隨機(jī)抽取數(shù)據(jù)

    這篇文章主要介紹了如何基于Python語言實(shí)現(xiàn)隨機(jī)從大量的Excel表格文件中選取一部分?jǐn)?shù)據(jù),并將全部文件中隨機(jī)獲取的數(shù)據(jù)合并為一個(gè)新的Excel表格文件的方法,希望對(duì)大家有所幫助
    2023-05-05
  • Python scipy實(shí)現(xiàn)差分進(jìn)化算法

    Python scipy實(shí)現(xiàn)差分進(jìn)化算法

    差分進(jìn)化算法是廣義的遺傳算法的一種,核心思想是變異,這篇文章主要為大家介紹的則是著名的scipy庫(kù)中對(duì)差分進(jìn)化算法的實(shí)現(xiàn),希望對(duì)大家有所幫助
    2023-08-08
  • pandas.DataFrame.to_json按行轉(zhuǎn)json的方法

    pandas.DataFrame.to_json按行轉(zhuǎn)json的方法

    今天小編就為大家分享一篇pandas.DataFrame.to_json按行轉(zhuǎn)json的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 對(duì)python中執(zhí)行DOS命令的3種方法總結(jié)

    對(duì)python中執(zhí)行DOS命令的3種方法總結(jié)

    今天小編就為大家分享一篇對(duì)python中執(zhí)行DOS命令的3種方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助一起。一起跟隨小編過來看看吧
    2018-05-05
  • Python3 循環(huán)語句(for、while、break、range等)

    Python3 循環(huán)語句(for、while、break、range等)

    這篇文章主要介紹了Python3 循環(huán)語句(for、while、break、range等),大家把下面的文章看完就基本上就可以了解了python的循環(huán)實(shí)現(xiàn)方式了
    2017-11-11
  • pytorch?ssim計(jì)算詳細(xì)代碼例子

    pytorch?ssim計(jì)算詳細(xì)代碼例子

    這篇文章主要給大家介紹了關(guān)于pytorch?ssim計(jì)算的相關(guān)資料,結(jié)構(gòu)相似性(SSIM)是一種測(cè)量?jī)煞鶊D像的相似度的方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • 控制Python浮點(diǎn)數(shù)輸出位數(shù)的操作方法

    控制Python浮點(diǎn)數(shù)輸出位數(shù)的操作方法

    在python的輸出結(jié)果中,尤其是浮點(diǎn)數(shù)的輸出,當(dāng)我們需要寫入文本文件時(shí),最好是采用統(tǒng)一的輸出格式,這樣也能夠增強(qiáng)結(jié)果的可讀性,這篇文章主要介紹了控制Python浮點(diǎn)數(shù)輸出位數(shù)的方法,需要的朋友可以參考下
    2022-04-04
  • Python高階函數(shù)之filter()函數(shù)代碼示例

    Python高階函數(shù)之filter()函數(shù)代碼示例

    這篇文章主要介紹了Python高階函數(shù)之filter()函數(shù)代碼示例,獲取了一個(gè)序列的時(shí)候,想要把一些內(nèi)容去掉,保留一部分內(nèi)容的時(shí)候可以使用高效的filter()函數(shù),需要的朋友可以參考下
    2023-07-07

最新評(píng)論

卢氏县| 西昌市| 堆龙德庆县| 错那县| 唐海县| 合山市| 华蓥市| 策勒县| 军事| 繁峙县| 宜丰县| 海原县| 郑州市| 苍南县| 广安市| 内乡县| 镇巴县| 绥德县| 开化县| 门源| 台江县| 波密县| 苗栗市| 江陵县| 三都| 陵川县| 固阳县| 神农架林区| 张家川| 布尔津县| 自贡市| 潜江市| 化州市| 射洪县| 东莞市| 云梦县| 蓬安县| 金坛市| 福清市| 桦南县| 利津县|