os.listdir ()을 사용하여 숨김 파일을 무시하는 방법은 무엇입니까?


87

내 파이썬 스크립트 os.listdir(path)는 경로가 하나씩 처리해야하는 아카이브를 포함하는 대기열 인 위치를 실행합니다 .

문제는 목록을 배열로 얻은 다음 간단한 array.pop(0). 프로젝트를 전복시킬 때까지 잘 작동했습니다. 이제 .svn배열에 폴더가 생겼고 물론 응용 프로그램이 충돌합니다.

그래서 여기 내 질문이 있습니다 : 실행할 때 숨겨진 파일을 무시하는 기능이 os.listdir()있습니까? 아니면 최선의 방법은 무엇입니까?

답변:


102

직접 작성할 수 있습니다.

def listdir_nohidden(path):
    for f in os.listdir(path):
        if not f.startswith('.'):
            yield f

또는 glob을 사용할 수 있습니다 .

def listdir_nohidden(path):
    return glob.glob(os.path.join(path, '*'))

둘 중 하나는로 시작하는 모든 파일 이름을 무시합니다 '.'.


1
제안 된 함수 listdir_nohidden는를 os.listdir사용 yield하면 생성기가 되므로와 호환되지 않습니다 . 대신 os.listdir'.'로 시작하는 항목을 제거 하고 출력 목록을 실행해야합니다 .
Milo Wielondek

3
@ 0sh : 왜 제자리에서 물건을 제거해야합니까? 그냥 않는 새로운 기능을 정의 list(listdir_nohidden(path))하고 새로운 기능과 완전히 호환입니다 os.listdir.
abarnert 2013 년

47

이것은 오래된 질문이지만 목록 이해력 사용에 대한 분명한 대답이 누락 된 것처럼 보이므로 완전성을 위해 여기에 추가합니다.

[f for f in os.listdir(path) if not f.startswith('.')]

참고로 문서 상태 listdir는 '임의의 순서'로 결과를 반환하지만 일반적인 사용 사례는 알파벳순으로 정렬하는 것입니다. 대소 문자를 구분하지 않고 디렉토리 내용을 알파벳순으로 정렬하려면 다음을 사용할 수 있습니다.

sorted([f for f in os.listdir('./')], key=lambda f: f.lower())

5
key=lambda f: f.lower()람다없이 작성할 수 있습니다.key=str.lower
Jean-François Fabre

2
두 가지를 결합하려면 :sorted([f for f in os.listdir('./') if not f.startswith('.')], key=str.lower)
Robert

18

Windows, Linux 및 OS X :

if os.name == 'nt':
    import win32api, win32con


def folder_is_hidden(p):
    if os.name== 'nt':
        attribute = win32api.GetFileAttributes(p)
        return attribute & (win32con.FILE_ATTRIBUTE_HIDDEN | win32con.FILE_ATTRIBUTE_SYSTEM)
    else:
        return p.startswith('.') #linux-osx

2
Mac에서도 작동해야하며 숨겨진 파일은 '.'로 시작합니다. 게다가.
Verena Haunschmid 2013 년

2
이것은 유일한 휴대용 대답, 훌륭하지만 다른 대답은 os.listdir에 대한 전체 래퍼를 제공하므로 ...[f for f in os.listdir(path) if not folder_is_hidden(f)]
SensorSmith


14

글롭 :

>>> import glob
>>> glob.glob('*')

( glob사용 listdir하고 fnmatch후드 아래에서 주장 하지만 '.'을 사용하지 않고 선행을 확인합니다 fnmatch.)


6

루프의 모든 항목을 처리하는 것은 너무 많은 작업이라고 생각합니다. 다음과 같이 더 간단한 것을 선호합니다.

lst = os.listdir(path)
if '.DS_Store' in lst:
    lst.remove('.DS_Store')

디렉토리에 숨겨진 파일두 개 이상 포함 된 경우 다음이 도움이 될 수 있습니다.

all_files = os.popen('ls -1').read()
lst = all_files.split('\n')

@Josh가 언급했듯이 플랫폼 독립성을 위해 glob이 잘 작동합니다.

import glob
glob.glob('*')

그것은 당신이있는 경우에만 작동하는 하나 개의 숨겨진 파일을, 그리고 당신은 그것의 이름을 알고있다. 사전에 알 수없는 임의의 이름을 가진 수십 개의 숨겨진 파일이 디렉토리에 포함되어 있다면 어떨까요?
FeRD

안녕하세요 @FeRD, 예. Mac에서 배치 / 백 로그 처리를 할 때 모든 파일을 새 폴더에 넣고 .DS_Store자동으로 생성됩니다. 모든 파일을 압축하여 서버에 푸시 .DS_Store하면 추가됩니다. 다양한 숨겨진 파일이있는 경우에 당신이 시도 할 수 있습니다os.system('ls -1')
사용자 923,227

크로스 플랫폼이 아닙니다. os.popen('ls -1').read()Windows에서는 작동하지 않습니다. 그것이 os.listdir().
FeRD

1
filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.