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")
の部分です。
いろいろ参考にして見たのですがここまでが限界でした。
お詳しい方教えて頂けませんでしょうか?
宜しくお願い致します
No.1ベストアンサー
- 回答日時:
まずこのサイトでは行頭空白は削除されるのでPythonのインデントが保存されない。
したがって制御構造を含むPythonコードはまともに読めなくなるので、空白を全角空白など別の文字に置き換えてそれらしく見えるようにしないと分かりにくいのよ。それでresultには1行がテキストで入って、追加コードでは1行ごとに書き込んでいるということで良いのかな。
そうするとsheet.cell(row=1,column=1,...)のコードはA1セルに書き込んでいるので常にA1に上書きされるのは当たり前ですね。
sheet.cell(row=i,column=1,...)
とすれば下の行に書かれていくのではないでしょうか。
あと毎回新しいワークブックを開いて1行書いて保存しているので前の回に書き込んだものは忘れていますね。ワークブックの作成はループに入る前に一回だけにしましょう。保存はループ内で毎回でも構いません。
あと最期にwb.close()をしておきましょう。開いたまま閉じないループだと資源を使い切って問題が発生するリスクがあります。これはWorkbookの実装がちゃんとしていれば滅多なことはないと思いますが。
No.2
- 回答日時:
こんばんは
pythonは全く知りませんし、インデントもないのでわからなくなっていますけれど・・
ざっと見だけですが、
>sheet.cell(row=1,column=1,value=result)
なら、同じところに書いているだけなので
>テキスト化されたものがセルA1に上書きされている様です。
は当然の結果ではないでしょうか。
変数 i を行番号にしようとしているみたいですから、それを利用すればいいのでは?
sheet.cell(row=i,column=1,value=result)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- Excel(エクセル) VBAにてエクセルをpdf化する方法 1 2023/03/10 16:20
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Excel(エクセル) エクセルシートをVBAでpdfで保存したい 2 2022/06/27 10:17
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Excel(エクセル) 【マクロ】ファイル名の日付によって、保管するフォルダを、自動選択したい 4 2023/08/16 11:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
「例外 *** は対応する try 文...
-
setAttribute(String, int)は適...
-
Selenium IDEでexportしたコー...
-
文字列を数式に
-
HTMLでのTableタグデータ取得方法
-
サーバーAからサーバーBへPOST...
-
本文から指定文字列の抽出
-
アプレットを実行すると、×が表...
-
importするには java.io.*; imp...
-
AndroidStudio SQL文の値を取得...
-
Javaからストアド実行(配列項目)
-
データの外挿について
-
JAVA 乱数で同じ数字を出さな...
-
JPEG画像のみを印刷したいので...
-
ColabでのPytorchのエラー
-
ジャバスクリプトについて。
-
ボタンの複数割り当てについて
-
C言語のポインターに関する警告
-
[JAVA]try 内の変数を外で!?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
「例外 *** は対応する try 文...
-
ColabでのPytorchのエラー
-
Javaを使ってデジタル時計を作...
-
<forEach> 内で供給された "ite...
-
文字列を数式に
-
importするには java.io.*; imp...
-
python OpenPyXLを使って出力結...
-
Selenium IDEでexportしたコー...
-
シャットダウンフックが呼ばれない
-
Java3Dで横置き円筒体の円筒中...
-
Javaで常駐するソフトを作って...
-
生年月日と今日の日付から年齢...
-
Javaを使用して定時送信をしたい
-
干支の計算で。。。
-
Java での グローバルIP取得
-
GridBagLayoutについての質問
-
ファイル名を動的に生成したい
-
HTMLでのTableタグデータ取得方法
-
importとextendsの用い方の違い...
おすすめ情報