読者です 読者をやめる 読者になる 読者になる

hellkite 日記と雑記とメモ。

Shiki Kazamaの駄文と音楽と、時々技術な感じ

Pythonでファイル一覧取得&コンソールアプリの呼び出し


スポンサーリンク


Pythonのようなスクリプト言語の用途として、作業の自動化といったキーワードが出てくると思います。
自動化と言っても色々とあると思いますが、今回は画像解析用コンソールアプリに画像を引数に渡して連続動作させるというシチュエーションで役にたった内容を書こうと思います。
まぁコンソールアプリに大量のファイルを処理させる場合は、使えると思います。
内容は、以下の2つです。

  1. フォルダの中のファイル名を取得する
  2. 外部アプリ(コンソールアプリ)を引数ありで呼び出す

ちなみに使用するPythonは、3.5系です。

あるフォルダの中のファイル名を取得する

osモジュールのscandir()を使用します。取得したDirEntryインスタンスには、ファイル名や絶対パスディレクトリかファイルか、といった情報が入っています。

import os

# ディレクトリの一覧
for entry in os.scandir('.'):
    if entry.is_dir():
        print(entry.name)

# ファイルの一覧
for entry in os.scandir('.'):
    if entry.is_file():
        print(entry.name)

取得したフォルダの先のファイルも再帰的に取得することはできないようです。ディレクトリかファイルかが識別できるので、ディレクトリだった場合は、さらにその先をscandirすることでフォルダ内全てのファイルを走査できます。

外部アプリ(コンソールアプリ)を引数ありで呼び出す

色々やりかたがあるみたいですが、subprocessを使用しています。外部アプリの出力結果をログファイルに書きこむため、標準出力を取得しています。ここではprint文で結果を表示しています。

import subprocess

p = subprocess.Popen(['dir', '.\\test'], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
stdout_data, stderr_data = p.communicate()
print(stdout_data)


今回、1枚当たり数分かかるような解析処理を数百枚行う必要があったのですが*1、これらを使って自動で動かせるようにしました。ついでにコンソールに出力される情報をログとして保存し、その動作ログに記載されている結果をExcelにまとめるというところまでやったので動かせば仕事が終わっていく状態に。
解析パラメータを変更して再度実行、ということもこれなら気軽にできます。手作業によるミスも減ってめでたしめでたし。

*1:画像認識では、よくあることですよね?