yieldでファイル一覧を取得する

このディレクトリにあるファイル一覧がほしいな」って思ったことございませんか!?

今日はそんな時に便利な方法を、Pythonにある「yield」を使って取得していく方法をご紹介したいと思います!

yieldって?

yield」を使うと、関数の処理一時停止しデータを返す事ができます!「return」の場合は関数の処理を終了してデータを返すので、似ているようで結構違います。

今回の様にファイル一覧が欲しい時、「return」を使う場合は、ファイル一覧のデータを作成しますね。例えば10000個のファイルがあった場合は、10000個の要素があるリストデータを生成します。

一方「yield」の場合は、関数を処理中に、データを返し一時停止、また再開してデータを返し一時停止を繰り返すので、10000個の要素があるリストデータ生成する必要がありません。って言うことは大きなメモリ消費がないっということですね!(*´ω`*)b

os.walk

指定されたディレクトリにあるファイルを調べるには、「os.walk」を使うといいと思います。試しに使ってみると、この様になります。

import os

for root, dirs, files in os.walk(r'C:\Users\owner\Documents\maya\projects\default'):
    print root
    print dirs
    print files
    print '+' * 100

実行してみると、こんな感じです。(ちょっと長いので省略しています。)

C:\Users\owner\Documents\maya\projects\default
['assets', 'autosave', 'cache', 'clips', 'data', 'images', 'movies', 'renderData', 'sceneAssembly', 'scenes', 'scripts', 'sound', 'sourceimages', 'Time Editor']
['workspace.mel']
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C:\Users\owner\Documents\maya\projects\default\assets
[]
[]
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C:\Users\owner\Documents\maya\projects\default\autosave
[]
[]
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C:\Users\owner\Documents\maya\projects\default\cache
['bifrost', 'nCache', 'particles']
[]
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

ディレクトリの位置、そこにあるディレクトリ、ファイルが表示されます。

ファイル一覧

先程の「os.walk」の「files」を更に繰り返し処理し、「yield」を使って「データを返し一時停止」を繰り返す関数を作ってみます。(`・ω・´)ゞ

# 指定されたディレクトリ以下の、ファイルを検索する関数
def getDirectryTree(rootDir):
	# 指定されたディレクトリ以下を、走査する。
	for root, dirs, files in os.walk(rootDir):
		# ファイルを1つずつ処理する
		for file in files:
			# パスを組み立てて、一旦返す
			yield os.path.join(root, file)

return」の場合と違い、巨大なリストを作ったりしなくていいのでイイですね!(*´ω`*)b

この関数を使って、ファイル一覧をprintする場合は、この様になります!

import os

def getDirectryTree(rootDir):
	# 指定されたディレクトリ以下を、走査する。
	for root, dirs, files in os.walk(rootDir):
		# ファイルを1つずつ処理する
		for file in files:
			# パスを組み立てて、一旦返す
			yield os.path.join(root, file)
			
for file in getDirectryTree(r'C:\Users\owner\Documents\maya\projects\default'):
	print file