ディレクトリツリーの渡り歩き

作成日 : 2025-05-20
最終更新日 :

ディレクトリツリーの渡り歩き

渡り歩き

ディレクトリの直下および配下のサブディレクトリすべてを再帰的に調べて、ディレクトリおよびサブディレクトリ配下のファイルを操作することを考える。 ディレクトリ配下のファイルを再帰的に調べることを渡り歩き(トラバース)と呼ぶことにする。 まずは、このようなファイルの渡り歩き方を、退屈なことは Python にやらせよう(以下「同書」)の p.221 から多少変更して引用する。

import os
for dirname, sub_dirs, filenames in os.walk('/home/username'):
  print('THe current dir is ' + dirname)

  for subdir in sub_dirs:
    print('SUBDIR OF ' + dirname + ': ' + subdir)
  
  for filename in filenames:
    print('FILE INSIDE ' + dirname + ': ' + filename)

  print('')

原プログラムとの変更点は、フォルダー(folder)およびサブフォルダー(subfolder)表記をディレクトリ(dir)およびサブディレクトリ(subdir)に変えたことである。

渡り歩きのプログラムが必要となった動機

インターネットの URL の作成

次に、filename から対応する URL を得る作業を追加した結果を示す。これには、同書 p.173 を参考に次のようにすればよい。

import os, re
url_base_regex = re.compile(r'/home/username/*')
for dirname, sub_dirs, filenames in os.walk('/home/username'):
  url_base = url_base_regex.sub('https://hostname', dirname)
  print('The current dir is ' + dirname)

  for subdir in sub_dirs:
    print('SUBDIR OF ' + dirname + ': ' + subdir)
  
  for filename in filenames:
    url = url_base + '/' + filename
    # print('FILE INSIDE + dirname + ': ' + filename)
    print('URL ' + url)
  
  print('')

インターネットの URL へのアクセス

最後に、URL に実際にアクセスをして、正常なレスポンスが得られるかどうかを確認し、 正常でないレスポンスの場合に該当する URL を表示する。これには、同書 pp.264-265 を参考にした。

import os, re, requests

url_base_regex = re.compile(r'/home/55/smm5600/internet/*')
for dirname, sub_dirs, filenames in os.walk('/home/55/smm5600/internet/www.ne.jp/asahi/music/marinkyo'):
  url_base = url_base_regex.sub('https://', dirname)

  for subdir in sub_dirs:
    print('SUBDIR OF ' + dirname + ': ' + subdir)

  for filename in filenames:
    url = url_base + '/' + filename
    res = requests.head(url)
    if (res.status_code != requests.codes.ok):
      print(url)

  print('')
  

ここで、requests.get() 関数ではなく requests.head() 関数を使ったのは、URL で表されるファイルのダウンロードを目的としてはいないからである。

まりんきょ学問所Python の開墾 > ディレクトリツリーの渡り歩き


MARUYAMA Satosi