akuruhinode's blog

pythonやC#を中心に興味を持った内容について調べています。

Python ファイル名のリストをCSV形式で保存

はじめに

ここでは、ファイル名のリストをCSV形式で保存する方法を説明します。

バージョン情報

python: 3.7.9
pandas: 1.2.3

ソースコード

絶対パスで保存

ソースコードは以下の通りです。pythonでは、globを利用することで簡単にフォルダ内のファイルのリストを再帰的に取得できます。
CSVファイルを出力する方法はいくつかありますが、ここではPandasを利用しています。

import glob
import pandas as pd
file_list = glob.glob(r'C:\example\**\*.*', recursive=True) 

df = pd.DataFrame(file_list) 
# df = pd.DataFrame(file_list, columns=['filename']) #列名を指定する

df.to_csv('file_list.csv',header=False, index=False)
# df.to_csv('file_list.csv',header=True, index=True) # インデックスと列名を保存する

ここではglob()にてrecursive=Trueを指定することで、サブフォルダを含めてファイルのリストを取得しています。

'C:\example\**\*.*'では、C:\exampleフォルダ内に複数のサブフォルダがあることを想定して\**\を指定しています。また、すべての拡張子のファイルを取得するために、*.*を指定しています。テキストファイルのみ取得する場合は、*.txtとします。

フォルダ名とファイル名を分割して保存

上のコードでは絶対パスで保存されますが、以下のようにすればフォルダ名とファイル名を分割してCSVファイルに保存できます。

import os, glob
import pandas as pd
file_list = glob.glob(r'C:\example\**\*.*', recursive=True) 
file_list = map(lambda x: os.path.split(x),file_list)

df = pd.DataFrame(file_list, columns=['folder', 'filename'])
df.to_csv('file_list.csv',header=False, index=False)

フォルダ名とファイル名を細かく分割して保存

上のコードでは絶対パスがファイル名とフォルダパスの2つの要素に分割されますが、フォルダごとに細かく分割して保存したい場合は、以下のようにします。os.path.split(x)ではなく、x.split(os.sep)としている点が上のコードとの違いです。こうすることで、OSのパス区切り文字に応じてすべてのフォルダが分割されます。

import os, glob
import pandas as pd
file_list = glob.glob(r'C:\example\**\*.*', recursive=True) 
file_list = map(lambda x: x.split(os.sep), file_list)

df = pd.DataFrame(file_list)
df.to_csv('file_list.csv',header=False, index=False)

ファイル名のみ保存

ファイル名だけを保存したい場合は以下のようにします。ここでは、C:\example以下のテキストファイルのみを取得します。

import os, glob
import pandas as pd
file_list = glob.glob(r'C:\example\*.txt') 
file_list = map(lambda x: os.path.basename(x),file_list)

df = pd.DataFrame(file_list, columns=['filename'])
df.to_csv('file_list.csv',header=False, index=False)