2013-08-04 4 views
0

"items"목록에 하위 디렉토리를 추가하려고 시도했으며 아래 코드를 사용하여이 작업을 완료했습니다.os.walk를 사용하여 목록에 추가

root, dirs, files = iter(os.walk(PATH_TO_DIRECTORY)).next() 
items = [{ 
    'label': directory, 'path': plugin.url_for('test') 
} for count, directory in enumerate(dirs)] 

위의 작동하지만 놀라 울 정도로 느립니다. os.walk는 매우 빠르지 만 어떤 이유로 루프가 느립니다.

나는

아래
for root, dirs, files in os.walk(PATH_TO_DIRECTORY): 

처럼 os.walk 동안 "항목"목록에 추가, 한 번에 모든 것을하려고 노력하지만 꽤에 디렉토리를 추가 할 수있는 권한 구문을 가져올 수 없습니다 명부.

os.walk의 모든 예제는 온라인으로 찾을 수 있는데, 간단히 말해서 print의 dir 또는 파일을 사용합니다.이 예제는 사용 예로서 좋지만 실제로는별로 유용하지 않습니다.

저는 파이썬을 처음 접했을뿐입니다. 어떤 사람들은 첫 번째 예제 에서처럼 별도의 루프없이 목록을 얻는 방법을 조언 할 수 있습니까?

(내가 파이썬에서 "디렉토리"또는 뭔가하지리스트라고 알고 있습니다. 그냥 배열을 호출과 함께 할 수하자 ... :-)

감사

답변

2

plugin.url_for()는 어떤 일을하는지 잘 모르지만 조금 속도를 낼 수 있어야한다. 그것은이 방법 : 만약 당신이 그것의 사용을하지 않는 한 당신이 그것을 사용하지 않는 것 같다 나는 루트 파일 변수를 떨어

plugin_url_for = plugin.url_for 
_, dirs, _ = iter(os.walk(PATH_TO_DIRECTORY)).next() 
items = [{ 
    'label': directory, 'path': plugin_url_for('test') 
} for directory in dirs] 

도 DIRS에 열거를 제거했습니다. 그러나, 이상한 이유로 그것을 필요로한다면 다시 넣으십시오. 테스트하여 도움이되었는지 알려주십시오. 분명한 이유 때문에 제대로 테스트 할 수 없습니다.

+0

눈부신 속도가 눈에 띄게 빨라진다.관심 밖의 이유로'plugin_url_for = plugin.url_for'을하고 루프에서 변수를 사용 했습니까? – superphonic

+0

루프 내에서'plugin.urL_for '를 사용하면 인터프리터는 각 반복에서 메소드 분석을 수행해야합니다. 메서드를 로컬 변수에 저장 한 다음 해당 변수를 통해 메서드에 액세스하면 메서드 조회 결과를 캐싱 할 수 있습니다. – Alp

+0

@Alp 물론, 그 말이 맞는 ... – superphonic

0
dirlist = [] 
for root, dirs, files in os.walk(PATH_TO_DIRECTORY): 
    dirlist += dirs 

트릭을해야 할 것입니다! 수정 된 질문에 대한

, 나는 당신이 정말 필요로하는 것은 아마의 출력 생각 :

Dirdict = {} 
for (root, dirs, files) in os.walk (START): 
    Dirdict [root] = dirs 
당신이 원하는 또는 plugin_url (루트)와 루트의 일부 인코딩을해야 할 수도 있습니다

는이 당신에게 하나의 사전을 줄 것 여기서 plugin_url (some_path)을 검색하고 해당 경로의 모든 디렉토리 목록을 얻을 수 있습니다. 당신이하고있는 일은 모두 하나의 키로 사전리스트를 만드는 것입니다. 파이썬 2.7의 콜렉션에서 사용할 수있는 namedtupple과 파이썬 3에 내장 된 것으로 의심된다. ​​

+0

내 첫 번째 코드 스 니펫 에서처럼 내 항목 배열을 가져 오기 위해 dirlist를 반복 할 필요가 없습니까? 나는 별도의 루프없이 아이템 배열이 내가 무엇을했는지 명확하지 않은 것처럼 보입니다. – superphonic

+0

죄송합니다 답변을 –

+0

누락 될 수 있습니다,하지만이 부분은 나에게주지 않습니다 - items = [{ '레이블': 디렉토리, '경로': plugin.url_for ('test') } count, enumerate (dirs)의 디렉토리] - 다음 배열 ... – superphonic