2012-11-20 2 views
2

나는 첫 번째 파이썬 스크립트를 통해 99 %의 길을 가고있다. 그러나 나는 디렉토리의 파일들을 통해 for-each 루프와 동등한 결과를 얻고있다. 내 스크립트는 단일 파일을 위해 작업하고 있습니다. 한 번에 하나씩 여러 파일에 적용하는 방법을 모르겠습니다.파이썬에서 파일 디렉토리를 반복하기

내가 원하는 경로 path = ~/documents와 파일 이름을 가진 XML 파일을 제외 할 수 있습니다

<root><synced name="Already Synced"><sfile name="Filename">base</sfile><sfile name="Filename">File1.blah</sfile><sfile name="Filename">File2.blah</sfile><sfile name="Filename">File3.blah</sfile></synced></root> 

는 어떻게 말, 내 스크립트를 실행하는 것, *.blah으로 종료하고 XML에없는 모든 파일 sfile?

나는이 있었지만 더 - 이동 없었다 :
path = '~/documents' 
tree = ET.parse("sync_list.xml") 
root = tree.getroot() 
for elem in root.findall('sfile'): 
    synced = elem.text 
do_library = os.listdir(path) 
if glob.fnmatch.fnmatch(file,"*.blah") and not synced: 
    for entry in do_library: 
    file = os.path.join(path, entry) 
    result = plistlib.readPlist('file') 

는 당신에게 당신이 제공 할 수있는 어떤 도움 주셔서 너무 감사드립니다.

+2

무엇을하고 있으며 무엇을하기를 기대합니까? – tacaswell

답변

1
import fnmatch 
import os 

path = os.path.expanduser('~/documents') 
tree = ET.parse("sync_list.xml") 
root = tree.getroot() 
synced = [elt.text for elt in root.findall('synced/sfile')] 
for filename in os.listdir(path): 
    if fnmatch.fnmatch(filename, '*.blah') and filename not in synced: 
     filename = os.path.join(path, filename) 

편집 : @mata가 제안한대로 os.path.expanduser가 추가되었습니다.

+0

이것은 작업에 매우 가깝지만 sync_list.xml에 나열된 파일 이름을 제외하지는 않습니다. 그것은 파일을 통해 제대로 루프했고 모든 논리를 실행합니다. 'root.findall ('sfile')'이 (가)'root.findall ('synced/sfile')'이어야했기 때문에 – sosukeinu

+0

'동기화 됨 '이 비어있었습니다. 아마도 지금 시도해보십시오. – unutbu

+0

완벽한! 많이 soooo 고마워. – sosukeinu

1
path = '~/documents' 

이렇게하면 홈 디렉토리에 documents 폴더가 생기지 않습니다. ~은 실제로 홈 디렉토리를 나타내지 않으므로 일반적으로 물결 확장을하는 쉘인 것처럼 사용할 수 있습니다. 그것 없이는, ~은 어떤 파일이나 디렉토리의 이름이 될 수 있으며, 파이썬은 그것을 파일로 취급합니다. 올바르게 사용하려면 다음을 사용하십시오.

path = os.path.expanduser('~/documents')