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

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

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

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



답변

직접 작성할 수 있습니다.

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

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


답변

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

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

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

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


답변

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


답변

Joshmaker는 귀하의 질문에 대한 올바른 해결책을 제공합니다.
os.listdir ()을 사용하여 숨김 파일을 무시하는 방법은 무엇입니까?

그러나 Python 3에서는 os 대신 pathlib를 사용하는 것이 좋습니다.

from pathlib import Path
visible_files = [
    file for file in Path(".").iterdir() if not file.name.startswith(".")
]


답변

글롭 :

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

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


답변

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

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


답변

filenames = (f.name for f in os.scandir() if not f.name.startswith('.'))