python のイテレータを再利用可能なリストへ変換

python のファイル一覧取得 os.scandir をループで使用して痛い目に遭う
  def test(dir):
    files = os.scandir(dir)

    print('list1')
    for file in files:
        print(file.path)

    print('list2')
    for file in files:
        print(file.path)
上記コードは、二度目のループでは中身が空で何も表示されない

os.scandir で生成したリスト(イテレータ)を使いまわししてたら動きがおかしいので調べたら、戻り値はイテレータなので、片方向リンクリストのように再利用時はインデックスが進んでしまっていて戻せないんだとか
os.scandir が FindFirstFile API を利用していたら、その方が合理的ではある

書き直すの面倒だなぁと思ってたら list関数でリストへ置き換えできるそうで、小変更で済みました
def test(dir):
    files = list(os.scandir(dir))

    print('list1')
    for file in files:
        print(file.path)

    print('list2')
    for file in files:
        print(file.path)

コメント