목록

2017-12-17 14 views
3

내가 이런 디렉토리 트리가 있다고 가정 주어진 시작 디렉토리에서 하위 디렉토리에있는 모든 파일 :목록

a/ 
├── b 
│   ├── d.png 
│   └── e 
│    └── f.png 
└── c.png 

내 원하는 출력은 다음과 같습니다 내가 a/b/에서 파일을 검색하려면를 : b/d.png & b/e/f.png

a/의 경우 : a/c.pnga/b/d.pnga/b/e/f.png

os.walk를 사용하여 하위 디렉토리에있는 모든 파일을 나열하는 방법을 알고 있으며 비슷한 상황을 많이 찾았지만 찾지 못했습니다. a/b/ 예상대로이 그것을 a/ 작동하지 않습니다 작동하는 동안

path = "a/b" 
pathBase = os.path.basename(path) 

for p, dirs, files in os.walk(path): 
    for file in files: 
     print(os.path.join(p.replace(path, pathBase),file)) 

:

여기 내 최신 시도합니다.

a의 출력은 c.pngb/d.pngb/e/f.png입니다. 예상과 다릅니다.

+0

"작동하지 않습니다." 정확히 의미합니까? –

+0

원래 게시물을'a /'에 대한 출력으로 편집했습니다 –

답변

2

에 코드를 할 예정입니다 (거의) 올바른 당신은 path에서 후행 슬래시를 제거하지만, 어떤 경우에 당신은 상대 파일 경로 계산 os.path.relpath을 사용하는 경우는 : 그것은, pathlib 차종 가치가 무엇인지를 들어

import os 

def f(path): 
    path = path.rstrip(os.sep) 
    parent = os.path.dirname(path) 
    for p, dirs, files in os.walk(path): 
     for file in files: 
      print(os.path.relpath(os.path.join(p, file), parent)) 

을 경로 조작이 더 쉽습니다.

from pathlib import Path 

def f(path): 
    path = Path(path) 
    for x in path.rglob('*'): 
     if not x.is_dir(): 
      print(x.relative_to(path.parent)) 
+0

'path = "a /"'에 대한 출력은'a/c.png'가 아닌'c.png' 등입니다. 여기는 내가 붙어 있습니다 –

+0

아하! 귀하의 편집 후, 지금 당장 예상대로 작동합니다. 하지만 경로를 벗겨 내서 올바른 답을 얻는 이유를 조금 더 설명 할 수 있습니까? –

+1

@JonasEphrem 원래 코드에서'path'를'path = 'a /''에 빈 문자열을 반환하는'os.path.basename (path)'로 대체했습니다. 이름이 항상 공백이 아닌지 확인하기 위해 후행 슬래시를 제거 할 수 있습니다. OTOH가'path'에 대해서'os.path.dirname'은 빈 문자열을 예상했을 때''a''를 리턴했고, 후행 슬래시를 제거하면 그것을 해결합니다. ['os.path.normpath'] (https://docs.python.org/3/library/os.path.html#os.path.normpath)를 사용하여 전체 경로 정규화를 수행 할 수 있습니다. 그 과정의). – vaultah