Pythonでディレクトリとファイルを再帰的に走査する方法の紹介

零下一度
リリース: 2017-07-16 12:00:31
オリジナル
2284 人が閲覧しました

日常の開発では、「ディレクトリまたはフォルダー」内に必要なファイルやフォルダーがあるかどうかを確認する必要があることがよくあります。次の記事では、Python が再帰と walk() を使用してディレクトリファイルを走査する方法を主に紹介します。

方法 1: 再帰呼び出し:

[html] view plain copy
#!/usr/bin/python  
#coding:utf8  
  
import os  
  
def dirlist(path, allfile):  
    filelist =  os.listdir(path)  
  
    for filename in filelist:  
        filepath = os.path.join(path, filename)  
        if os.path.isdir(filepath):  
            dirlist(filepath, allfile)  
        else:  
            allfile.append(filepath)  
    return allfile  
  
print dirlist("/home/yuan/testdir", [])
ログイン後にコピー

方法 2:

os.walk()

この関数は、

generator オブジェクトを使用してディレクトリ ツリー全体を走査します。 top はディレクトリの最上位レベルを指定し、topdown はディレクトリを上から下 (デフォルト値) に移動するか、下から上に移動するかを示すブール値です。返されたジェネレーターはタプル (dirpath、dirnames、filenames) を生成します。ここで、dirpath はディレクトリへのパスを含む
文字列、dirnames は dirpath 内のすべてのサブディレクトリのリスト、filename は dirpath A 内のファイルの名前です。ディレクトリを除くリスト。 oneerror 引数は、単一の引数を受け入れる関数です。 処理中にエラーが発生した場合、この関数は os.error オプションを使用して呼び出されます。デフォルトの動作では、エラーは無視されます。ディレクトリが上から下にトラバースされる場合、ディレクトリ名を変更するとトラバース プロセスに影響します。

[python] view plain copy
#!/user/bin/python  
#!conding=utf8  
  
import os  
g = os.walk("/home/yuan/testdir")  
  
  
for path,d,filelist in g:  
    print d;  
    for filename in filelist:  
        print os.path.join(path, filename)
ログイン後にコピー

「ディレクトリまたはフォルダー」内に必要なファイルまたはフォルダーがあるかどうかを確認する必要があることがよくあります。Python では、ループ内のすべてのファイルとフォルダーを走査する必要があります。指定されたディレクトリには複数レベルのディレクトリが含まれており、1 つは

再帰的思考 をたどる方法、もう 1 つは os モジュール の walk() 関数です。以下で説明することはあまりありません。詳細な紹介で:

ディレクトリ構造をリストする

1. 再帰メソッド

 #coding:utf-8
 import os
 allfile=[]
 def getallfile(path):
  allfilelist=os.listdir(path)
  for file in allfilelist:
   filepath=os.path.join(path,file)
   #判断是不是文件夹
   if os.path.isdir(filepath):
    getallfile(filepath)
   allfile.append(filepath)
  return allfile

 if name == 'main':

  path="C:\Users\zs\PycharmProjects\demo"
  allfiles=getallfile(path)

  for item in allfiles:
   print item


#结果
C:\Users\zs\PycharmProjects\demo\.idea\demo.iml
C:\Users\zs\PycharmProjects\demo\.idea\encodings.xml
C:\Users\zs\PycharmProjects\demo\.idea\misc.xml
C:\Users\zs\PycharmProjects\demo\.idea\modules.xml
C:\Users\zs\PycharmProjects\demo\.idea\workspace.xml
C:\Users\zs\PycharmProjects\demo\.idea
C:\Users\zs\PycharmProjects\demo\functiondemo.py
C:\Users\zs\PycharmProjects\demo\index.py
C:\Users\zs\PycharmProjects\demo\locale\en_US\LC_MESSAGES\django.po
C:\Users\zs\PycharmProjects\demo\locale\en_US\LC_MESSAGES
C:\Users\zs\PycharmProjects\demo\locale\en_US
C:\Users\zs\PycharmProjects\demo\locale\zh_CN\LC_MESSAGES\lang.mo
C:\Users\zs\PycharmProjects\demo\locale\zh_CN\LC_MESSAGES\lang.po
C:\Users\zs\PycharmProjects\demo\locale\zh_CN\LC_MESSAGES
C:\Users\zs\PycharmProjects\demo\locale\zh_CN
C:\Users\zs\PycharmProjects\demo\locale
C:\Users\zs\PycharmProjects\demo\name.txt
C:\Users\zs\PycharmProjects\demo\text.txt
ログイン後にコピー

リストに再帰のアイデアを借用するすべてのフォルダーの内容、それがディレクトリの場合は、独自のメソッドの呼び出しを続けます。

2.os モジュールの walk() 関数

os.walk(top, topdown=True, onerror=None, followlinks=False)

は 3 要素のタプル、(dirpath、

dirnames、filenames)、

  • dirpath: を返します。リストされているものを指定しますディレクトリへのパス

  • dirnames: ディレクトリ下のすべてのフォルダ

  • filenames: ディレクトリ下のすべてのファイル

パラメータ 1: top - ルート ディレクトリ下のすべてのフォルダ (それ自体を含む) は、3-タプル (ディレクトリパス, ディレクトリ名, ファイル名) [フォルダパス, フォルダ名, ファイル名]。

パラメータ 2: topdown – オプション。True または指定されていなくても、ディレクトリの 3 タプルは、そのサブフォルダの 3 タプルより前に生成されます (ディレクトリは上から下へ)。 topdown が False の場合、ディレクトリの 3 タプルは、そのサブディレクトリ (ディレクトリは下から上) の 3 タプルの後に生成されます。

パラメータ 3: onerror – オプションで、呼び出されたときに 1 つのパラメータ (OSError インスタンス) を持つ関数です。このエラーを報告した後、ウォークを続行するか、

例外をスローしてウォークを終了します。

パラメータ 4: followlinks – true に設定すると、ディレクトリはソフト リンクを通じてアクセスされます。


#coding:utf-8
import os

def getallfiles(path):
 allfile=[]
 for dirpath,dirnames,filenames in os.walk(path):
  for dir in dirnames:
   allfile.append(os.path.join(dirpath,dir))
  for name in filenames:
   allfile.append(os.path.join(dirpath, name))
 return allfile
if name == 'main':
 path = "C:\Users\zs\PycharmProjects\demo"
 allfile=getallfiles(path)
 for file in allfile:
  print file




#输出结果

C:\Users\zs\PycharmProjects\demo\.idea
C:\Users\zs\PycharmProjects\demo\locale
C:\Users\zs\PycharmProjects\demo\functiondemo.py
C:\Users\zs\PycharmProjects\demo\index.py
C:\Users\zs\PycharmProjects\demo\name.txt
C:\Users\zs\PycharmProjects\demo\text.txt
C:\Users\zs\PycharmProjects\demo\.idea\demo.iml
C:\Users\zs\PycharmProjects\demo\.idea\encodings.xml
C:\Users\zs\PycharmProjects\demo\.idea\misc.xml
C:\Users\zs\PycharmProjects\demo\.idea\modules.xml
C:\Users\zs\PycharmProjects\demo\.idea\workspace.xml
C:\Users\zs\PycharmProjects\demo\locale\en_US
C:\Users\zs\PycharmProjects\demo\locale\zh_CN
C:\Users\zs\PycharmProjects\demo\locale\en_US\LC_MESSAGES
C:\Users\zs\PycharmProjects\demo\locale\en_US\LC_MESSAGES\django.po
C:\Users\zs\PycharmProjects\demo\locale\zh_CN\LC_MESSAGES
C:\Users\zs\PycharmProjects\demo\locale\zh_CN\LC_MESSAGES\lang.mo
C:\Users\zs\PycharmProjects\demo\locale\zh_CN\LC_MESSAGES\lang.po
ログイン後にコピー

概要

2つのメソッドの入力結果は同じです。ただし、入力の順序が異なります。それに比べて、PythonのOSモジュールのwalk()メソッドは比較的シンプルな気がします

以上がPythonでディレクトリとファイルを再帰的に走査する方法の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート