os.walkによるタプルの中身

Pythonでディレクトリとファイル名の一覧を表示するためにos.walkを使います。


リファレンスを参考に、os.walk(任意のディレクトリ)はタプルで(dirpath, dirname, filenames)を生成します。

  • dirpath ・・・ 文字列で、ディレクトリへのパス
  • dirname ・・・ dirpath内のサブディレクトリ名のリスト
  • filenames ・・・ dirpath 内の非ディレクトリ・ファイル名のリスト


dirpath, dirname, filenamesがどのように表示されるか、次のディレクトリ構成をもとに確認してみます。(treeコマンドの実行結果)

.

-- dir1
`-- dir1-1
`-- dir1-1-1
`-- file1.txt
-- dir2
`-- dir2-1
`-- file2.txt
`-- dir2-2
-- dir3
`-- file3.txt

`-- walker.py


walker.pyはos.walkを実行するファイルです。

# walker.pyの中身
!/usr/bin/python
# -*- coding:utf-8 -*-
import os

rootdir = "./"
for (root, dirs, files) in os.walk(rootdir):
    print root


このwalker.pyの最後のprintステートメントで、root, dirs, filesを指定したときのそれぞれの結果を確認していきます。


1. print rootの結果

./
./dir3
./dir1
./dir1/dir1-1
./dir1/dir1-1/dir1-1-1
./dir2
./dir2/dir2-2
./dir2/dir2-1


2. print dirsの結果

['dir3', 'dir1', 'dir2']

['dir1-1']
['dir1-1-1']

['dir2-2', 'dir2-1']


3. print filesの結果
['walker.py']
['file3.txt']


['file1.txt']


['file2.txt']


1〜3のそれぞれの結果を一行ずつ繋ぎ合わせるとディレクトリ構造がつながることが分かります。


それぞれのファイルのフルパスを表示するために、printステートメント部分を以下に書き換えます。

for file in files:
    print os.path.join(root, file)


この結果は、

./walker.py
./dir3/file3.txt
./dir1/dir1-1/dir1-1-1/file1.txt
./dir2/dir2-1/file2.txt

となります。