【悩み】
・pyocrのプログラムを実行したけど異常終了して動かない。
・tool = tools[0] IndexError: list index out of rangeのエラー原因を知りたい。
・pyocr.get_available_tools()を使ったPythonプログラムを正常実行したい。
こういった「悩み」に答えます。
【本記事の内容】
① pyocrとは?
➁ pyocr.get_available_toolsでlist index out of rangeが発生した経緯
➂ pyocr.get_available_toolsでlist index out of rangeが発生する原因
④ pyocr.get_available_toolsでlist index out of rangeを解決する手順
本記事を実践したことで、5分くらいで「pyocr.get_available_toolsを使った際に発生するIndexError: list index out of range」のエラーを解決できました(下の動画参照)。
記事の前半では「pyocrとは?」や「本エラーの発生経緯」を解説します。
記事の後半では「本エラーの発生原因」から「解決する方法」までを紹介します。
この記事を読み終えることで、「エラーで動かないpyocrプログラムを解消でき、正常に動く状態」になるはずです。
pyocrとは:PythonでOCRができるライブラリ
「pyocrとは?」に関しては、以下の記事「PythonでOCRができるライブラリ」の箇所をご覧ください。
>> 【最短5分】PythonとOCRでPDFや画像から文字認識をする方法
画像内に写っている「文字」を抽出したい場合、pyocrを使うことで実現できます。
続いて、pyocrを使っていると発生しやすい「IndexError: list index out of range」に関して紹介しますね。
pyocr.get_available_toolsでlist index out of rangeが発生した経緯
「pyocr.get_available_toolsでlist index out of rangeが発生した経緯」に関して解説します。
本事象が発生した当時は、納期が近く、「数日前までは発生しなかったのになぜ?」と思いつつ、慌てふためいた記憶があります。
筆者は、以下のようなPythonプログラムをWindows上で実行しようと考えていました。
import os
import sys
import re
from PIL import Image
import pyocr
# pyocrが利用するOCRエンジンをTesseractに設定
tools = pyocr.get_available_tools()
print(tools)
tool = tools[0]
# OCR(文字認識)させた画像ファイルを読み込み
ocr_image_file_path = "./input/postgresql_top_jp.jpg"
img = Image.open(ocr_image_file_path)
# OCR(文字認識)の実施
builder = pyocr.builders.TextBuilder(tesseract_layout=6)
text = tool.image_to_string(img, lang="jpn", builder=builder)
print(text)
ちなみに、上に記載したpyocrを使ったプログラムの詳細を知りたい方には、以下の記事がオススメです。
>> 【最短5分】PythonとOCRでPDFや画像から文字認識をする方法
上記プログラムを「pyocr-test.py」というファイル名で保存します。
保存したファイルを実行するために、以下のコマンドを実行したところ、「IndexError」が発生しました。
python pyocr-test.py
Traceback (most recent call last):
File "C:\Users\user\Desktop\work\pyocr-test.py", line 10, in <module>
tool = tools[0]
IndexError: list index out of range
本事象は、以下の日時と環境で発生しました。
動作確認済み日時:2022年10月31日
動作確認済み環境:
・MacOS Catalina
・Windows 11 pro
以上が、「pyocr.get_available_toolsでlist index out of rangeが発生した経緯」となります。
pyocr.get_available_toolsでlist index out of rangeが発生する原因
「pyocr.get_available_toolsでlist index out of rangeが発生する原因」に関して解説します。
list index out of rangeが発生する原因としては、「Tesseractの実行ファイルをうまく参照できていないから」となります。
本事象(IndexError: list index out of range)が発生する原因は、以下となります。
【発生原因】
エラーの意味:
「リストに対して範囲外のインデックスを指定しています」です。
エラー箇所:
tools = pyocr.get_available_tools()部分で空のリストを取得
そのため、tool = tools[0]で範囲外のインデックスを指定しエラーが発生
原因:
pyocr.get_available_tools()でTesseractを参照できていないためです。
参照できない理由としては、主に以下が考えられます。
・環境変数にTesseractが設定されていない
・システムトラブルで環境変数を参照できない
・そもそもTesseractがインストールされていない
以上が、「pyocr.get_available_toolsでlist index out of rangeが発生する原因」となります。
pyocr.get_available_toolsでlist index out of rangeを解決する手順
「pyocr.get_available_toolsでlist index out of rangeを解決する手順」に関してご紹介します。
【解決方法】
手順1:Tesseractのインストール先を確認
手順2:pyocr.tesseract.TESSERACT_CMDでTesseractのPATHを設定
以降で、上記手順の各項目に関してご説明します。
手順1:Tesseractのインストール先を確認
まずは、Tesseractのインストール先を確認しましょう。
エラーを解消するためには、Tesseractのインストール先を知る必要があります。
Tesseractのインストール先を調べるために、以下のコマンドを「ターミナル」や「コマンドプロンプト」上で実行してください。
【MacOS/Linux/Ubuntuの場合】
sudo su -
find / -name 'tesseract*'
【Windowsの場合】
cd C:\
where /r . tesseract.exe
筆者のパソコンでは、「C:\Program Files\Tesseract-OCR\tesseract.exe」にTesseractがインストールされていました。
Tesseractのインストール先が見つからなかった場合、Tesseractがそもそもインストールされていない可能性があります。その場合は、以下の記事を参照し、インストールしましょう。
>> 【Linux向け】Tesseract(OCR/文字認識)をインストールする手順
>> 【Mac向け】Tesseract(OCR/文字認識)をインストールする手順
>> 【Windows向け】Tesseract(OCR/文字認識)のインストール手順
手順2:pyocr.tesseract.TESSERACT_CMDでTesseractのPATHを設定
続いて、Pythonプログラムを修正していきましょう。
プログラムに「pyocr.tesseract.TESSERACT_CMD」を追加することで、本エラーを解消できます。
本事象を解決するために、以下のようにプログラムを修正します。
import os
import sys
import re
from PIL import Image
import pyocr
# TesseractのインストールPATHを設定 ★追加★
pyocr.tesseract.TESSERACT_CMD = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
# pyocrが利用するOCRエンジンをTesseractに設定
tools = pyocr.get_available_tools()
print(tools)
tool = tools[0]
# OCR(文字認識)させた画像ファイルを読み込み
ocr_image_file_path = "./input/postgresql_top_jp.jpg"
img = Image.open(ocr_image_file_path)
# OCR(文字認識)の実施
builder = pyocr.builders.TextBuilder(tesseract_layout=6)
text = tool.image_to_string(img, lang="jpn", builder=builder)
print(text)
上記のようにプログラムを修正した上で実行したところ、「IndexError: list index out of range」が発生せず、無事にpyocrプログラムが正常終了しました(下の動画参照)。
今回、事象を解消するために追加した「pyocr.tesseract.TESSERACT_CMD」のリファレンスは、以下となります。
【pyocr.tesseract.TESSERACT_CMDのリファレンス】
処理:pyocrが使うTesseractを設定
使い方:pyocr.tesseract.TESSERACT_CMD = Tesseractのインストール先
初期値:tesseract.exe
参照:公式ドキュメントなし。プログラムから使い方を判断(ソースコード)
上記の流れで、本事象を無事に解消できました。
pyocr.get_available_toolsでlist index out of rangeが発生しても慌てる必要はないです。エラー内容を理解し、一つ一つ原因をつぶすことで本問題を解消できます。
【まとめ】pyocr.get_available_toolsのlist index out of range
いかがでしたでしょうか?
上記で紹介した「pyocr.tesseract.TESSERACT_CMD」をエラーが発生したプログラムに追加していただくと、「IndexError: list index out of range」を解消できます。
最後にもう一度内容を確認しましょう。
【IndexError: list index out of rangeの原因と解決方法】
・原因
pyocr.get_available_tools()でTesseractを参照できていないため
・解決するための手順は2つ
手順1:Tesseractのインストール先を確認
手順2:pyocr.tesseract.TESSERACT_CMDをプログラムに追加
体系的にTesseractを学習したい方には、本ブログで紹介している以下の記事がオススメです。
例えば、「インストール手順」や「縦書き日本語を文字認識方法」などをコピペで実践できるレベルでご紹介しています。
コメント