プロが教えるわが家の防犯対策術!

python初心者です。

下記コードは使い指定フォルダ内に複数あるPDFファイルの特定の範囲の画像を切り出しOCRでテキスト化するものです。
ネット上で見つけ参考にさせて頂いたものです。
動作は成功しましたが、出力結果をエクセルに書き込む為にコードを追加しましたがうまくいきません。


import pyautogui as pag
import pyocr
from PIL import Image
import sys
import subprocess
import pyperclip
import os
import time
import openpyxl as px





pyocr.tesseract.TESSERACT_CMD = r"C:\Program Files\Tesseract-OCR\tesseract.exe"


acr_path ="C:\Program Files (x86)\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe"

#PDF指定
pdf_path = r"C:\\○○○\\○○○\\○○○\\test\\PDFファイル\\"

pdf_list = os.listdir(pdf_path)
i = 1

#OCRを動かして、テキストデータに変換(スペース削除)
def run_ocr(tool,name_img):
result = tool.image_to_string(name_img,lang='jpn')
result = result.replace(' ','')
print(result)
return result

if __name__=='__main__':

#OCR呼び出し
tools = pyocr.get_available_tools()
tool = tools[0]

#フォルダ内にあるPDFファイルをループ
for idx,file in enumerate(pdf_list):

#PDFファイルを開く
pdf_pro = subprocess.Popen([acr_path,pdf_path+file],shell=False)
time.sleep(2)

#座標指定箇所を切り取りして画像保存
name_img = pag.screenshot(str(i) + 'temp.png',region=(920, 240, 160, 60))

#指定座標を文字起こししてテキスト変換
result =run_ocr(tool,name_img)

i = i + 1

wb = px.Workbook()
sheet = wb.create_sheet('sheet1')
sheet.cell(row=1,column=1,value=result)
wb.save(r"結果.xlsx")



pdf_pro.kill()
time.sleep(1)




コードを実行すると「結果.xlsx"」内の「Sheet1」という名前の新たなシートに、テキスト化されたものがセルA1に上書きされている様です。
成功イメージは「結果.xlsx"」のSheet1(1枚目)のセルA1からA2、A3と下にどんどん出力結果が書き込まれることです。
追加したコードは
wb = px.Workbook()
sheet = wb.create_sheet('sheet1')
sheet.cell(row=1,column=1,value=result)
wb.save(r"結果.xlsx")
の部分です。

いろいろ参考にして見たのですがここまでが限界でした。
お詳しい方教えて頂けませんでしょうか?
宜しくお願い致します

A 回答 (2件)

まずこのサイトでは行頭空白は削除されるのでPythonのインデントが保存されない。

したがって制御構造を含むPythonコードはまともに読めなくなるので、空白を全角空白など別の文字に置き換えてそれらしく見えるようにしないと分かりにくいのよ。

それでresultには1行がテキストで入って、追加コードでは1行ごとに書き込んでいるということで良いのかな。
そうするとsheet.cell(row=1,column=1,...)のコードはA1セルに書き込んでいるので常にA1に上書きされるのは当たり前ですね。
sheet.cell(row=i,column=1,...)
とすれば下の行に書かれていくのではないでしょうか。
あと毎回新しいワークブックを開いて1行書いて保存しているので前の回に書き込んだものは忘れていますね。ワークブックの作成はループに入る前に一回だけにしましょう。保存はループ内で毎回でも構いません。
あと最期にwb.close()をしておきましょう。開いたまま閉じないループだと資源を使い切って問題が発生するリスクがあります。これはWorkbookの実装がちゃんとしていれば滅多なことはないと思いますが。
    • good
    • 0
この回答へのお礼

バッチリうまくいきました!ありがとうございます!

お礼日時:2022/06/07 21:05

こんばんは



pythonは全く知りませんし、インデントもないのでわからなくなっていますけれど・・

ざっと見だけですが、
>sheet.cell(row=1,column=1,value=result)
なら、同じところに書いているだけなので
>テキスト化されたものがセルA1に上書きされている様です。
は当然の結果ではないでしょうか。

変数 i を行番号にしようとしているみたいですから、それを利用すればいいのでは?
 sheet.cell(row=i,column=1,value=result)
    • good
    • 0
この回答へのお礼

ありがとうございます。うまくいきました!

お礼日時:2022/06/07 21:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!