파이썬에서 디렉토리와 파일을 재귀적으로 순회하는 방법 소개

零下一度
풀어 주다: 2017-07-16 12:00:31
원래의
2296명이 탐색했습니다.

일상적인 개발에서 우리는 "디렉토리나 폴더" 안에 원하는 파일이나 폴더가 있는지 확인해야 하는 경우가 많습니다. 다음 글에서는 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는 디렉터리 경로를 포함하는 string이고, 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에서는 루프의 모든 파일과 폴더를 순회해야 합니다. 다중 레벨 디렉토리를 포함하는 두 가지 방법이 있는데, 하나는 재귀적 사고를 통과하는 것이고, 다른 하나는 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-을 생성합니다. 튜플 (dirpath, dirnames, filenames) [폴더 경로, 폴더 이름, 파일 이름].

매개변수 2: topdown – 선택 사항, True 또는 지정되지 않음, 디렉터리의 3-튜플은 하위 폴더의 3-튜플(디렉터리 위에서 아래로)보다 먼저 생성됩니다. topdown이 False인 경우 디렉터리의 3-튜플은 해당 하위 폴더(디렉터리 아래에서 위로)의 3-튜플 다음에 생성됩니다.

매개변수 3: onerror - 선택 사항이며 호출 시 하나의 매개변수인 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
로그인 후 복사

Summary

두 가지 방법의 입력 결과는 동일합니다. 하지만 입력 순서에는 차이가 있습니다. 그에 비해 파이썬 os 모듈의 walk() 메소드는 상대적으로 간단하다고 느껴집니다

위 내용은 파이썬에서 디렉토리와 파일을 재귀적으로 순회하는 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿