주어진 디렉토리에있는 파일들을 어떻게 반복 할 수 있습니까?


555

.asm주어진 디렉토리 내의 모든 파일 을 반복 하고 그에 대한 조치를 취해야합니다.

어떻게 효율적으로 할 수 있습니까?

답변:


807

원래 답변 :

import os

for filename in os.listdir(directory):
    if filename.endswith(".asm") or filename.endswith(".py"): 
         # print(os.path.join(directory, filename))
        continue
    else:
        continue

위의 답변의 Python 3.6 버전은 다음과 같은 변수에 객체 os로 디렉토리 경로가 있다고 가정합니다 .strdirectory_in_str

import os

directory = os.fsencode(directory_in_str)

for file in os.listdir(directory):
     filename = os.fsdecode(file)
     if filename.endswith(".asm") or filename.endswith(".py"): 
         # print(os.path.join(directory, filename))
         continue
     else:
         continue

또는 반복적으로 사용 pathlib:

from pathlib import Path

pathlist = Path(directory_in_str).glob('**/*.asm')
for path in pathlist:
     # because path is object not string
     path_in_str = str(path)
     # print(path_in_str)

1
이것은 디렉토리 아래에 디렉토리 또는 파일을 즉시 나열하는 것 같습니다. 아래 pedromateo의 답변은 재귀 목록을 작성하는 것으로 보입니다.
Jay Sheth

8
Python 3.6에서 디렉토리는 바이트 단위로 예상되며 listdir은 파일 이름 목록을 바이트 데이터 유형으로 뱉어 내므로 직접 종료 할 수는 없습니다. 이 코드 블록은 다음과 같이 변경되어야합니다.directory = os.fsencode(directory_in_str) for file in os.listdir(directory): filename = os.fsdecode(file) if filename.endswith(".asm") or filename.endswith(".py"): # print(os.path.join(directory, filename)) continue else: continue
Kim Stacks

13
print(os.path.join(directory, filename))print(os.path.join(directory_in_str, filename))파이썬 3.6에서 작동 하도록 변경해야합니다.
Hugo Koopmans

54
2017 년 이후에이 내용이 표시되면 os.scandir (dir_str)을 사용할 수 있으며 훨씬 더 깔끔합니다. fsencode가 필요 없습니다. for entry in os.scandir(path): print(entry.path)
염소

2
선호 if filename.endswith((".asm", ".py")):if filename.endswith(".asm") or filename.endswith(".py"):
Maroloccio

152

이것은 디렉토리의 직계 자식뿐만 아니라 모든 자손 파일을 반복합니다.

import os

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        #print os.path.join(subdir, file)
        filepath = subdir + os.sep + file

        if filepath.endswith(".asm"):
            print (filepath)

3
os.walk 기능에 대한 참조는 다음에 있습니다. docs.python.org/2/library/os.path.html#os.path.walk
ScottMcC

136

glob 모듈을 사용해보십시오 .

import glob

for filepath in glob.iglob('my_dir/*.asm'):
    print(filepath)

Python 3.5부터 하위 디렉토리도 검색 할 수 있습니다.

glob.glob('**/*.txt', recursive=True) # => ['2.txt', 'sub/3.txt']

문서에서 :

glob 모듈은 결과가 임의의 순서로 리턴되지만 Unix 쉘이 사용하는 규칙에 따라 지정된 패턴과 일치하는 모든 경로 이름을 찾습니다. 물결표 확장은 수행되지 않지만 []로 표시되는 *,? 및 문자 범위는 올바르게 일치합니다.


19

Python 3.5부터 os.scandir ( )을 사용하면 작업이 훨씬 쉬워집니다.

with os.scandir(path) as it:
    for entry in it:
        if entry.name.endswith(".asm") and entry.is_file():
            print(entry.name, entry.path)

os.DirEntry 객체는 디렉토리를 스캔 할 때 운영 체제에서 정보를 제공 할 경우이 정보를 노출하므로 listdir () 대신 scandir ()을 사용하면 파일 유형 또는 파일 속성 정보가 필요한 코드의 성능이 크게 향상 될 수 있습니다. 모든 os.DirEntry 메소드는 시스템 호출을 수행 할 수 있지만 is_dir () 및 is_file ()은 일반적으로 기호 링크에 대한 시스템 호출 만 필요합니다. os.DirEntry.stat ()는 항상 Unix에서 시스템 호출이 필요하지만 Windows에서는 기호 링크에 대한 호출 만 필요합니다.


entryA는 posix.DirEntry의 등 편리한 방법의 무리와 함께 유형은 entry.is_dir(), is_file(),is_symlink()
crypdick

17

Python 3.4 이상 은 표준 라이브러리에서 pathlib 를 제공 합니다. 당신은 할 수 있습니다 :

from pathlib import Path

asm_pths = [pth for pth in Path.cwd().iterdir()
            if pth.suffix == '.asm']

또는 목록 이해가 마음에 들지 않는 경우 :

asm_paths = []
for pth in Path.cwd().iterdir():
    if pth.suffix == '.asm':
        asm_pths.append(pth)

Path 객체를 쉽게 문자열로 변환 할 수 있습니다.


9

파이썬에서 파일을 반복하는 방법은 다음과 같습니다.

import os

path = 'the/name/of/your/path'

folder = os.fsencode(path)

filenames = []

for file in os.listdir(folder):
    filename = os.fsdecode(file)
    if filename.endswith( ('.jpeg', '.png', '.gif') ): # whatever file types you're using...
        filenames.append(filename)

filenames.sort() # now you have the filenames and can do something with them

이 기술 중 어느 것도 보증 명령을 보증하지 않습니다

예, 예측할 수 없습니다. 파일 이름을 정렬합니다. 파일 순서가 중요 할 경우 (예 : 비디오 프레임 또는 시간 종속 데이터 수집) 중요합니다. 그래도 파일 이름에 색인을 넣으십시오!


항상 정렬되지는 않습니다 ... im1, im10, im11 ..., im2 ... 그렇지 않으면 유용한 접근 방식. from pkg_resources import parse_version그리고 filenames.sort(key=parse_version)그것을했다.
Hastur

5

디렉토리와 목록을 참조하기 위해 glob 을 사용할 수 있습니다 .

import glob
import os

#to get the current working directory name
cwd = os.getcwd()
#Load the images from images folder.
for f in glob.glob('images\*.jpg'):   
    dir_name = get_dir_name(f)
    image_file_name = dir_name + '.jpg'
    #To print the file name with path (path will be in string)
    print (image_file_name)

배열의 모든 디렉토리 목록을 얻으려면 os 를 사용할 수 있습니다 :

os.listdir(directory)

4

나는이 구현에 아직 만족하지 않지만 DirectoryIndex._make(next(os.walk(input_path)))파일 목록을 원하는 경로를 전달할 수 있는 사용자 지정 생성자 를 원했습니다. 환영합니다!

import collections
import os

DirectoryIndex = collections.namedtuple('DirectoryIndex', ['root', 'dirs', 'files'])

for file_name in DirectoryIndex(*next(os.walk('.'))).files:
    file_path = os.path.join(path, file_name)

2

라이브러리에 scandir내장 된 지시문을 사용하는 것이 정말 os좋습니다. 다음은 실제 예입니다.

import os

i = 0
with os.scandir('/usr/local/bin') as root_dir:
    for path in root_dir:
        if path.is_file():
            i += 1
            print(f"Full path is: {path} and just the name is: {path.name}")
print(f"{i} files scanned successfully.")

중복 답변
crypdick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.