Pythonでフォルダ内のファイル一覧CSVを作成するプログラム

Pythonで仕事自動化:第1回の課題

フォルダ(カレントフォルダ)内のファイル一覧をCSVファイルに出力する。

日常業務でフォルダやファイルの操作や整理は、時間を浪費してしまう作業の一つです。そこで、今回はPythonを使ったファイル操作の基本として、フォルダ内のファイルをリストアップするプログラムを作成します。

この記事は、非プログラマーのビジネスマンが、プログラミングにより業務を効率化することを目的としています。そのためWindows環境で行います。プログラムの細かいことは、あまり気にしないで、まず実行してみて、自分用にカスタマイズして業務に役立ててください。

この記事の目次

準備

以下の記事を参考にWindowsにPythonをインストールしてください。

PythonをWindowsにインストールしてプログラミング学習を始める(ガンマソフト株式会社)
https://gammasoft.jp/python/python-install-on-windows/

まず実行してみましょう

1. メニューからPythonのIDLEを開きます。

python idle select from menu

2. エディタを開いて、コードを貼り付ける

ツールバーのメニューから File > New File を選択すると新しいウィンドウが開きます。そこに、以下のプログラムコードをコピーして貼り付けてください。

import os, csv, time

listFile = 'filelist.csv'
dateFormat = '%Y/%m/%d %H:%M:%S'

csvFile = open(listFile, 'w', newline='')
csvWriter = csv.writer(csvFile)

for filename in os.listdir():
    
    if os.path.isfile(filename) \
       and os.path.basename(__file__) != filename \
       and listFile != filename:
        row = []
        # ファイル名
        row.append(filename)
        # ファイル作成日時
        row.append(time.strftime(dateFormat, \
                   time.localtime(os.path.getctime(filename))))
        # ファイル更新日時
        row.append(time.strftime(dateFormat, \
                   time.localtime(os.path.getmtime(filename))))

        csvWriter.writerow(row)

csvFile.close()

ここで、バックスラッシュ(\)は、貼り付けると以下のように(¥)に変わります。この \(¥)は、1行のプログラムを改行するときのマークです。つまり、Pythonはこのマークで連結されたプログラムは1行とみなします。

python editor copy code

3. コードの保存

ドキュメントフォルダ(Documents)に「programpy」フォルダを作成しておきます(好きな名前でも大丈夫です)。ツールバーのメニューから File > Save を選択して、「listingfiles.py」という名前で、作成したフォルダに保存します。

4. テストファイルの準備

どんなファイルでも構わないので、5〜10程度の適当なファイルを、先ほど作成した「programpy」フォルダにコピーします。

python idle select from menu

5. プログラムの実行

以下のようにツールバーのメニューから Run > Run Module を選択するとプログラムが実行されます。

python idle select from menu

6. 結果の確認

以下のように「filelist.csv」というファイルができます。

python idle select from menu

エクセルで確認すると以下のように出来上がっています。

python idle select from menu

任意のフォルダにプログラムをコピーして実行できます

Pythonはexeファイルを作らなくても、そのままでどこでも実行できます。これが、非常に便利なところです。今回のプログラム「listingfiles.py」を適当なフォルダにコピーして、ダブルクリックすると、同じように「filelist.csv」にファイル一覧が出力されます。

python idle select from menu

カスタマイズのポイント

今回は、以下の3項目を出力しました。

  • ファイル名
  • ファイル作成日時
  • ファイル更新日時

これらの項目は簡単に書き換えることができます。たとえば、以下の項目に変更してみます。

  • ファイル名
  • ファイル更新日時
  • ファイル容量(新規追加)
import os, csv, time

listFile = 'filelist.csv'
dateFormat = '%Y/%m/%d %H:%M:%S'

csvFile = open(listFile, 'w', newline='')
csvWriter = csv.writer(csvFile)

for filename in os.listdir():
    
    if os.path.isfile(filename) \
       and os.path.basename(__file__) != filename \
       and listFile != filename:
        row = []
        # ファイル名
        row.append(filename)
        # ファイル作成日時 -> コメントアウト
        #row.append(time.strftime(dateFormat, \
        #           time.localtime(os.path.getctime(filename))))
        # ファイル更新日時
        row.append(time.strftime(dateFormat, \
                   time.localtime(os.path.getmtime(filename))))
        # ファイル容量 -> 新規追加
        row.append(os.path.getsize(filename))

        csvWriter.writerow(row)

csvFile.close()
ポイント1:使わないコードは # でコメントアウト

ここでは、ファイル作成日時は項目から除外するので、以下のように先頭に#を加えてコメントアウトして、その部分はプログラムを実行しないようにします。

        #row.append(time.strftime(dateFormat, \
        #           time.localtime(os.path.getctime(filename))))
ポイント2:項目は row.append で追加する

追加したい項目(カラム)は、以下のように row.append で追加します。これは、rowという名前を付けたリストに追加(append)し、それをcsvWriter.writerow でcsvファイルに1行として書き込みます。

        row.append(os.path.getsize(filename))
ポイント3:row.append の前はスペースを8つ付ける

Pythonではブロックを構成している行の前には、空白文字(スペース)を4つ付ける必要があります。ブロックとは命令のグループです。

ここでは、以下のようにfor のブロックがあり、そのなかにさらに if のブロックがあります。

・・・
for filename in os.listdir():
1234<- for のブロック
    if os.path.isfile(filename) \
       and os.path.basename(__file__) != filename \
       and listFile != filename:
12341234<- if のブロック
        row = []
        row.append(filename)
・・・

このifブロックは、forブロックに含まれているので、ifブロックに属する row.append の先頭には、空白文字が 4 ☓ 2 = 8つ付くことになります。

ポイント4:ファイル情報の取得方法

以下の表を参考に、必要なファイル情報を組み合わせてください。

ファイル情報 取得方法(プログラム) 解説
拡張子 os.path.splitext(filename)[1]
最後にアクセスした日時 os.path.getatime(filename) 日本時間で書式を指定して出力するために次のようにする
time.strftime(dateFormat,time.localtime(ここに書く)))
作成日時 os.path.getctime(filename)
最後に更新した日時 os.path.getctime(filename)
フルパス os.path.abspath(filename) 例:C:¥User¥Taro¥Documents¥data.txt
サイズ os.path.getsize(filename) 単位はバイト

プログラムの細かいところは、カスタマイズを繰り返すうちに、少しづつわかってきます。ちなみに、open はファイルを開くfor は繰り返しif は条件による処理振り分け、を意味します。

プログラム上達のコツは、とにかく書いて実行することです。そして、明確な目的を持つことです。だから、実務経験があるビジネスマンほど、上達は早いのです。是非、チャレンジしてみてください。