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

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

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

この記事の目次

準備

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

Pythonはいま大ブレイクのプログラミング言語です。その背景には人工知能ブーム、それを支えるディープラーニングのほとんどがPythonで動かしていることにあります。ですが・・・ Pythonは…

まず実行してみましょう

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 で追加する

追加したい項目(カラム)は、1行の内容を表すrowというリストにrow.append で追加します。それをcsvWriter.writerow(row) で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 は条件による処理振り分け、を意味します。

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