2011-08-17 2 views
49

내 python 스크립트는 os.listdir(path)을 실행합니다. 여기서 경로는 하나씩 처리해야하는 아카이브가 들어있는 대기열입니다.os.listdir()을 사용하여 숨겨진 파일을 무시하는 방법은 무엇입니까?

문제는 배열의 목록을 가져온 다음 간단하게 array.pop(0)을 수행한다는 것입니다. 프로젝트를 전복시킬 때까지 잘 작동했습니다. 이제 내 배열에 .svn 폴더가 생기고 물론 응용 프로그램이 다운됩니다.

여기 내 질문이 있습니다. os.listdir()을 실행할 때 숨겨진 파일을 무시하는 기존 기능이 있습니까? 그렇지 않은 경우 가장 좋은 방법은 무엇입니까?

감사합니다.

답변

60

당신은 하나를 쓸 수 있습니다 자신 :

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, '*')) 

이 중 하나는 '.'으로 시작하는 모든 파일 이름을 무시합니다. 윈도우, 리눅스와 OS X에

+1

제안 기능은'listdir_nohidden'이 os.listdir''와 아주 호환되지 않습니다, yield''를 사용하기 때문에 그것을 발전기로 만든다. 대신에'os.listdir'의 출력리스트를 거쳐 '.'로 시작하는 엔트리를 제거해야합니다. – 0sh

+1

@ 0sh : 왜 물건을 제자리에서 제거해야합니까? 'list (listdir_nohidden (path))'를 수행하는 새로운 함수를 정의하고 새로운 함수는'os.listdir'와 정확히 호환됩니다. – abarnert

10

glob :

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

(. glob 주장 후드 listdirfnmatch를 사용하는,하지만 그것도하지 fnmatch을 사용하여, 선도적 인 '.'를 확인합니다)

13

:

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에서 작동해야하며 숨겨진 파일은 '.' 게다가. –

+0

이것은 유일한 이식성있는 답변이며, 훌륭한 답변이지만 os.listdir에 대한 완전한 래퍼를 제공하는 다른 대답은 다음과 같습니다. '[f for os.listdir (path) in folder_is_hidden (f)]' – SensorSmith

12
filter(lambda f: not f.startswith('.'), os.listdir('.')) 
13

이 오래된 질문이지만 지능형리스트를 사용하는 명백한 대답을없는 것 같다, 그래서 여기에 추가 해요 완전성 : 보조 노트로

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

, 주 listdir는 '임의의 순서'하지만 일반적인 사용 사례의 결과를 반환합니다 워드 프로세서 그들을 알파벳 순으로 정렬하는 것입니다. 당신이 알파벳 대문자와 관련없이 정렬 된 디렉토리 내용을 원한다면, 당신은 사용할 수 있습니다

sorted([f for f in os.listdir('./')], key=lambda f: f.lower()) 
0
filenames = (f.name for f in os.scandir() if not f.name.startswith('.')) 
관련 문제