2016-09-26 2 views
0

하위 디렉토리 목록을 반복하고 하위 디렉토리 내의 파일을 열고 파일 이름을 소문자로 변경하려고합니다. 여기 내 코드입니다 :디렉토리를 통한 파이썬 반복 및 이름 바꾸기

for root, subdirs, pics in os.walk(rootdir): 
    for pic in pics: 
    if pic.endswith('.jpg'): 
     picpath = os.path.join(pic) 
     #print pic 
     print picpath 
     #os.rename(pic, pic.replace(" ", "-").lower()) 
     os.rename(picpath, picpath.replace(" ", "-").lower()) 

나는 다음 얻을 :

Traceback (most recent call last): File "imageresizing-renamefiles.py", line 19, in os.rename(picpath, picpath.replace(" ", "-").lower()) OSError: [Errno 2] No such file or directory

내 파일 구조가 Image1jpgfolder1Image2jpg를 따르고 있습니다 코드에서 해당 폴더 내에서 실행되는 루트 디렉토리, folder2Image3jpgImage4jpg 등과 같이 폴더를 제외한 파일 이름을 소문자로 변경하기 위해 각각을 반복하고 싶습니다.

감사합니다.

+1

아마도'topdown = False'를'os.walk'에 넘겨 주길 원할 것입니다. – mgilson

+2

'picpath = os.path.join (pic)'->'picpath = os.path.join (root, pic)' –

+0

@mgilson 멋진 아이디어는 여기서는 불필요하지만 디렉토리 이름을 변경해야 할 경우 매우 유용 할 것입니다. –

답변

1
picpath = os.path.join(root, pic) 
        # ^^^^^ 

이 작업을 수행해야합니다. , the docs 당 당신은 "해당 파일"오류가 발생하는 이유입니다

Note that the names in the lists contain no path components. To get a full path (which begins with top) to a file or directory in dirpath, do os.path.join(dirpath, name).

: 오류가 발생하는 시점에서 root 아닌 현재 디렉토리의 파일 이름, 요청하고 있습니다.

+1

도'pic.endswith ('. jpg') :'isn 안전하지 않아. 'pic..lower() .endswith ('.jpg') :'또는'fnmatch' 모듈을 사용하여'IMG.JPG'가 보이지 않도록하는 것이 더 낫습니다. –

+0

@Gshare 코드, [edit your question] (https://stackoverflow.com/posts/39710929/edit)을 클릭하여 변경 사항을 끝에 추가하십시오 (이미있는 내용을 대체하지 마십시오). 이 문제가 해결되어 다른 문제가 발생하면 새로운 질문을하십시오! – cxw

+1

대상에서'lower()'는 대소 문자를 구분하는 파일 시스템에서 그것을 죽일 것입니다 : 파이썬은 전체 dir 구조의 이름을 소문자로 바꿀 수 없습니다 !! –

1

경로에 디렉토리 이름을 추가해야하거나 os.rename이 (가) 이름 바꾸기를 적용 할 적절한 디렉토리를 찾을 수 없습니다.

즉, 소문자로 변환하면 작업이 복잡해집니다. 소문자는 basename에만 적용해야합니다 (대소 문자는 중요하지 않으므로 Windows 파일 시스템에서 작동하지만 경로의 일부 디렉토리에 대문자가 포함되어 있으면 Linux에서는 실패합니다. 다행히도 rename 명령으로 전체 dirtree의 이름을 바꿀 수는 없습니다)

그리고 .jpg 연장 경기는 소문자로 사진 이름을 변환 할 특별한 경우 케이스에 관계없이 수행해야합니다 : 확장도 (

for root, subdirs, pics in os.walk(rootdir): 
    for pic in pics: 
    if pic.lower().endswith('.jpg'): # more powerful: fnmatch.fnmatch(pic,"*.jpg") 
     os.rename(os.path.join(root,pic), os.path.join(root,pic.replace(" ", "-").lower())) 
) 모든 DCIM 카메라처럼 대문자로 될 가능성이
+0

잘 잡으세요! 그것은 미묘한 것입니다. – cxw

+0

@cxw : 동시 응답을 게시하고 싶지는 않았지만 몇 가지 잠재적 인 문제가있어 각 문제에 대해 의견을 말하기가 어려워졌습니다. 네가 괜찮 으면 좋겠다. –

+0

물론 아닙니다! 어쨌든, 당신이 OP의 문제를 해결한다면, 당신은 그것을받을 가치가있는 담당자를 얻어야합니다. :) 실제로 개인적으로 대답 편집을 선호하거나 의견에 대한 게시물에 답변합니다 (어쩌면 내가 사회자가 될 수없는 이유 중 하나 일 수도 있습니다.)). – cxw

관련 문제