ミドリコ雑記帖

ミドリコが思いついたことをなんでも書く場所。Amazonアソシエイト参加、楽天アフィリエイト利用しています

【#08】プログラム完全初心者がPythonを触ってみた(試行錯誤の末ようやく最初の段階が終わる)

 前の記事はこちら。
midoliko-tsuki.hatenablog.com

  1. 結果フォルダを作成。フォルダ名は「ocr_作業した日時(yymmddhhmmss)」
  2. PDFフォルダのファイル名リストを取得
  3. ファイル名リストからPDFを選び出して変換対象リストを作る
  4. 変換対象リストから変換対象ファイルを選択する
  5. 変換対象ファイルの最後3文字をtxtに置換した文字列を作る
  6. 結果フォルダ内にテキストファイルを新規作成する。ファイル名は前項で作った、変換対象ファイルの最後3文字をtxtに置換した文字列
  7. 変換対象ファイルを画像に変換
  8. OCR
  9. テキストデータに変換する
  10. テキストファイルに保存して閉じる

 前回の記事で、ようやく1が終わりました。

 次はPDFフォルダのファイル名リストを取得する部分です。
 調べてみたらosとかpathlibとかいろいろあって混乱したのですが、読んでてなんとか理解できたこちらの記事を参考に、globモジュールを使ってみました。
weblabo.oscasierra.net

 で、この後どうしたらいいのか分からなくて夫に助けを求めてしまいました。

# ファイル数分だけ繰り返す
for oneFullPath in strFiles:

    # ファイルの場合
    if os.path.isfile(oneFullPath):
     
        # フルパスからファイル名を抽出
        strFileName = os.path.basename(oneFullPath)

 とりあえずこれだけ書いてもらった。

 後から理解したんですが、私はfor文がよく分かっていなかったのでした。「for 変数 in オブジェクト」の最初の変数で「知らない人出てきた! 誰!?!?」となってつまづいていたようです。どういう人なのかのキャラづけは後から自分でやるんですね。知らんわ! 自己紹介なしで飛び込んでくる知らない人こわい! ちゃんと名乗って!!

 あと、出てくる文字列が変数なのか関数なのか分かってない(なんのためにVSCodeを使っているのか)、変数に何が入っているのか分かっていないのでどうしていいのか分からなくなる、というのがあり、これについては変数の名前を工夫しなさいと言われました。格好悪くてもいいので、自分で見て、これがなんなのか、何に使うのか分かる名前をつけた方がいい、と。夫は「このへんは賛否両論あるとこだけど」とつけ加えていましたが、少なくともいまの私はそういう名前のつけ方をしたほうがいいなと思いました。

 で、続いては、抽出したファイル名から後ろ3文字を削る工程です。
 こちらの記事を参考にしました。
pg-chain.com

 えっ[ ]だけで文字が削れるの!? 簡単やん!? と感動したのですが、自分でやってみたら「pdf」だけが大量に切り取られて絶望しました。結局ここも夫に書いてもらいました。いまブログを書くために見返していてようやく理解しました。ブログ役に立ってるう(前向き)。

        #末尾が.pdfであれば
        if strFileName[-4:] == ".pdf":

            # ファイル名から後ろ3文字を削る
            strTxtName = strFileName[:-3]

            #ファイル名
            strTxtName = strTxtName + "txt"

「txt」を足してファイル名にするところだけようやく自分で書けました。

 ファイル名ができたところで、テキストファイルを作成します。
office54.net
 参考にしたのはこちら。


 さてこのあとは前にもやった工程です。PDFを画像に変換して、画像をOCRして、テキストデータに変換する。そのあと、テキストデータをテキストファイルに書き込んで、ファイルを閉じる。

# ファイルを作成
            f = open(strTxtName, 'w')
        
            # 画像オブジェクトからテキストに
            # テキストファイルに書き込む
            for image in images:
                txt = tool.image_to_string(
                    image,
                    lang=lang,
                    builder=pyocr.builders.TextBuilder()
                )
                f.write(txt)

            # ファイルを閉じる
            f.close()

 も、もしかして完成してしまったのでは〜!? と動かしてみたら、動きました。
 動いたのですが、できあがったテキストファイルが、苦心惨憺して作った現在時刻を名前にしたフォルダではなく、なぜか実行ファイルのあるフォルダに保存されていく! なんでや!
 ……見返してみて気づいたのですが、テキストファイルを新規作成するときに、保存先のパスを指定していませんでした。そりゃこうなりますね……。

 別にこのままでも構わないといえば構わないのですが(手動で移動させれば済む話)、まあまあ頑張って作ったフォルダなので使われてほしい。というわけで、今度はパスを指定しないといけません。

 なので今度は、テキストファイル保存先のパスを指定しないといけません。

 参考にしたのはこちら。
python.keicode.com

 フォルダ名はdir_name、ファイル名がstrTxtNameだからこれを足せばいけるのでは?

  
            # 結果ファイルのパスを指定
          resultPath=os.path.join(dir_name,strTxtName)

            # ファイルを作成
            f = open(resultPath, 'w')

 どや! とやってみたらエラーが出ました。なんでや! エラーメッセージを頑張って読んでみたら、そんなフォルダはないよって言ってるみたいでした。よくよく見返してみたら、dir_nameに入ってるのはフォルダの名前だけでパスではありませんでした。どうもすみません。


 これでどうだ!!!

            # 結果ファイルのパスを指定
            resultPath=os.path.join(path,dir_name,strTxtName)

            # ファイルを作成
            f = open(resultPath, 'w')

 で、できた〜!!!!!!!!!

 これでようやく、やりたいことの第一段階が終わりました。長かった……。

 続きはこちら。
midoliko-tsuki.hatenablog.com