2012-05-07 2 views
0

디렉토리 크기를 가져 오는 기능을 얻으려고합니다.경로가 갑자기 역 슬래시 됨

def fsize(path, returntype='b'): 
    size = 0 
    if isdir(path): 
     for root, dirs, files in walk(path): 
      for file in files: 
       size += getsize(join(path,file)) 

    else: 
     print abspath(path) 
     size = getsize(abspath(path)) 

    if returntype != 'b': 
     return convert_size(size, returntype) 
    return size 

path = r"D:\Library\Daniel's_Books" 

print fsize(path, 'm') 

나는이 재미 오류 얻을 :

size = getsize(abspath(path)) 
File "C:\Python27\lib\genericpath.py", line 49, in getsize 
return os.stat(filename).st_size 
WindowsError: [Error 2] The system cannot find the file specified: "D:\\Library\\Daniel's_Books\\cover.jpg" 
D:\Library\Daniel's_Books\cover.jpg 

이유는 백 슬래시를 백 슬래시 않습니다를? 오류를 해결하려면 어떻게해야합니까?

+0

나는 왜 그것이 \를 추가 할 것인지 확신 할 수 없다. 하지만 대신 "/"를 사용하려고 했습니까?일반적으로 대부분의 라이브러리와 언어가 포함 된 경로에서 더 잘 작동합니다. – TheSHEEEP

+0

예, 똑같은 것을 반환합니다. 정확하게. – mirandalol

+0

Windows Vista/7 및 사용 권한 문제와 같은 소리가납니다. 사용자의 외부 파일에 액세스하려고하기 때문에 ... – mensi

답변

4

첫 번째 질문

why does it backslash the backslashes?

에 관하여는 디스플레이의 문제이다. \은 이스케이프 문자이므로 의 문자열을 r'\' 또는 '\\'으로 줄 수 있습니다. 그리고 정확하게이 방법으로 그것은 마찬가지로 표시됩니다. 정확히 말하자면, 정확하게 reture가 the repr() function에 의해 표시되었습니다. BTW

: 당신으로 인해 같은 이유로

path = "D:\Library\Daniel's_Books" 

문제가 : \D\L가 유효한 이스케이프가 없기 때문에에만 작동합니다. 제대로 \의 탈출로 당신은 더 나은 문자열로

path = r"D:\Library\Daniel's_Books" 
원시 문자열로

또는

path = "D:\\Library\\Daniel's_Books" 

로 작성합니다.


두 번째 질문, 그러나,

and how can I fix the error?

조금 까다 롭습니다.

난 당신이 여러 재귀에 문제가 있다고 생각 : 한 손으로, walk() 완전히 나무를 통해 산책. 따라서 2 단계에서 join(path,file)이 잘못된 경우 pathroot으로 대체해야합니다. 반대로 fsize()을 반복적으로 호출하면 파일이 중복 될 수 있습니다.

. 
+- A 
| +- a 
| +- b 
+- B 
| +- a 
| +- b 
+- a 
+- b 

os.walk() 모든 디렉토리 레벨 root, dirs, files를 산출하여 주어진 트리를 통과 :

는 다음과 같은 트리를 가정합니다.

이 예에서

, 그것은

'.', ['A', 'B'], ['a', 'b'] 
'.\\A', [], ['a', 'b'] 
'.\\B', [], ['a', 'b'] 

그래서 rootfiles가에있는 현재의 처리 디렉토리를 포함 얻을 것입니다.

을 나는 가정 당신의 cover.jpg하지이 디렉토리에, Daniel's_Books의 하위 디렉토리에있는 그 자체. 올바른 디렉토리와 결합하면 발견 될 것입니다.

+0

문제를 해결하지 못했습니다. 또한; 나는 SOF에 대해 질문하기 전에 그것을 시도했다, 나는 게시하기 전에 나의 질문을 항상 연구한다. – mirandalol

+0

어느 문제? 당신은 왜'\'쌍이 있는지 알고 싶었고, 나는 이것을 대답했다. 내가 놓친 게 무엇입니까? – glglgl

+0

미안하지만 내가 충분히 명확하지 않아서 os.stat (경로) .st_size 함수를 완료 할 수 있도록 \\을 제거하는 방법을 알고 싶었습니다. – mirandalol

관련 문제