2013-08-29 3 views
2

디렉토리를 거쳐 특정 유형의 파일을 찾아 목록에 추가하는 방법을 알았습니다. 이제 파일 이름 목록이 있습니다. 어떻게 모두 열 수 있습니까?목록에서 파일을 여는 방법

import os 
import glob 
import subprocess 

os.chdir("/Users/blah/Desktop/Data") 
reflist = glob.glob('*raw_ref.SDAT') 
actlist = glob.glob('*raw_act.SDAT') 

for i in reflist: 
    os.popen("%r" %i) 

for j in actlist: 
    os.popen("%r" %j) 

P.S.을 : 여기에 지금까지 무엇을 가지고 내가 적은 수의 파일이 가능한 동시에 열을 갖는 것이 좋습니다

ref_files = [open(filename, ...) for filename in reflist] 
+3

'는 popen() '파일을 읽을 수 없습니다, 서브 프로세스를 산란을위한 것입니다. [파일 I/O에 대한 Python 자습서] (http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files)를 읽어 볼 수 있습니다. – cdhowie

+0

'os.popen'이 아니라'open()'을 사용하십시오. –

+0

또한 파일을 가지고 무엇을 _do_ 하시겠습니까? 그것들을 모두 열고 열어 둔 객체에 대한 참조를 유지하지 않으면 매우 유용하지 않을 것입니다. (예를 들어,'EMFILE' 오류가 발생하기 전에 누출 될 수있는 파일의 수를 테스트하지 않으면). 열려있는 각 파일을 사용할 수 있도록 변수 나 모음에 저장해야합니다. – abarnert

답변

3
ref_files = map(open, reflist) 

에있어 또는. 당신이 어떤 이유로, 모든 파일이 (내가 가능성이 찾을 수있는)를 동시에 열 필요하면

for file in reflist: 
    with open(file) as f: 
     pass # do stuff with f 
    # when with block ends, f is closed 

for file in actlist: 
    with open(file) as f: 
     pass # do stuff with f 
    # when with block ends, f is closed 

후 NPE의 솔루션과 함께 할 것입니다.

명심 당신이 파일에 대한 컨텍스트 관리자를 사용하지 않는 경우 I/O (같은 with 여기에 사용되는) 당신이이 완료되면 수동으로 파일을 닫아야 할 것이다.

+1

구현 한 경우 ref_files를 어떻게 실행합니까? –

4

: 당신이 open()의 인수를 통해 세밀하게 제어하려는 경우 나, 맥

+1

좋습니다. 모든 파일을 순차적으로 반복하려는 경우 [fileinput'] (http://docs.python.org/3/library/fileinput.html#fileinput.input)을 사용하여이 작업을 훨씬 간단하게 만들 수 있습니다. fileinput.input (reflist)을 f :'로 사용하면'for for line in f :'와 같이 하나의 큰 텍스트 파일로 취급 할 수 있습니다. (그리고 어떤 파일인지 알고 싶다면'filename' 등의 메서드를 사용할 수 있습니다.) – abarnert

+0

@abarnert IIRC - contextlib.closing (fileinput.input (reflist)) f :'- 그리고 심지어 그 사람이 기대할 것 인 경우 100 % 확실하지 않다. –

+0

@JonClements : 3.2 이상에서'fileinput.input'은 컨텍스트 관리자를 반환한다. 이전 버전에서는'closing'이 필요하지만 정확히 기대했던대로 동작합니다. 특히,'fileinput'은 한 번에 하나의 파일 만 열리도록 보장하고,'close'를 호출하면 그 파일을 닫을 것입니다. – abarnert

0

@Brian은 "가능한 한 동시에 파일을 열지 않는 것이 좋습니다"라고 말합니다. 그러나 이것은 당신이하고 싶은 일에 달려 있습니다. 당신이 읽기에 대한 몇 가지 열려있는 파일이 필요한 경우, 확인 파일이 마지막에 폐쇄되어 있는지 확인하려면이 옵션을 시도 할 수 있습니다 :

# I don't know MAC path names. 
filenames = ['/path/to/file', 'next/file', 'and/so/on'] 
# here the file descriptors are stored: 
fds = [] 
try: 
    for fn in filenames: 
     # optional: forgive open errors and process the accessible files 
     #try: 
      fds.append(open(fn)) 
     #except IOError: 
     # pass 

    # here you can read from files and do stuff, e.g. compare lines 
    current_lines = [fd.readline() for fd in fds] 
    # more code 

finally: 
    for fd in fds: 
     fd.close()