ディレクトリの直下および配下のサブディレクトリすべてを再帰的に調べて、ディレクトリおよびサブディレクトリ配下のファイルを操作することを考える。 ディレクトリ配下のファイルを再帰的に調べることを渡り歩き(トラバース)と呼ぶことにする。 まずは、このようなファイルの渡り歩き方を、退屈なことは 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)に変えたことである。
次に、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 を表示する。これには、同書 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 の開墾 > ディレクトリツリーの渡り歩き