2013-09-24 1 views
-1

를 열지 않고 연속 된 파일을 열면 30 ~ 40 말, 나는이 목록에파이썬 - 내가 파이썬 3.2에있는 파일의 숫자를 읽을 생각하면 물리적으로 모두

(모든 파일을 파일 참조를 유지하려면

+3

... 무엇? 파일을 열지 않고 파일을 열려고합니까? –

+1

시스템에서 전화를 걸지 않거나'file.open()'을 코드에 30-40 회 입력하지 않고 말입니까? 전자는 불가능합니다 (파일을 액세스해야 ... 액세스 할 수 있어야합니다). –

+0

나는 두 번째 작업을 수행하지 않고도 후자를 의미했다. 내 코드에 여러 번 입력하는 file.open()을 입력했다. – VivekGhosh

답변

6

이것은() 함수와

는 해당 파일이 목록에 처리에 내가 개별적으로 file.open를 통해 모든 파일을 열지 않고도 모든 파일을 열 수있는 방법 어쨌든 거기에) 공통 폴더에 간단합니다. 파일 경로 목록을 기반으로 목록 이해를 사용하십시오. 또는 한 번에 하나씩 만 액세스해야하는 경우 생성기 식을 사용하여 40 개의 파일을 모두 한 번에 열지 않도록하십시오. 나는 간단한 평면 디렉토리 여기에 가정 한

import os 
open_files = [open(f) for f in os.listdir(some_path)] 

하지만 참고os.listdir 반환 : 당신이 특정 디렉토리의 모든 파일에 대한 핸들을 원하는 경우에

list_of_filenames = ['/foo/bar', '/baz', '/tmp/foo'] 
open_files = [open(f) for f in list_of_filenames] 

os.listdir 기능을 사용 지정된 디렉토리에있는 모든 파일 객체에 대한 경로 목록입니다. 실제 파일이나 디렉토리인지 여부를 나타냅니다. 당신이 개방하고있는 디렉토리 내에서 디렉토리가 있다면 그래서, 당신은 os.path.isfile를 사용하여 결과를 필터링 할 수 있습니다 :

import os 
open_files = [open(f) for f in os.listdir(some_path) if os.path.isfile(f)] 

또한, os.listdir 만이 아니라 전체 경로보다, 베어 파일 이름을 반환 현재 그렇다면 작업 디렉토리가 some_path이 아닌 경우 os.path.join을 사용하여 절대 경로를 만들고 싶을 것입니다.

import os 
open_files = [open(os.path.join(some_path, f)) for f in os.listdir(some_path) 
       if os.path.isfile(f)] 
발전기 식

: 모든 경우에

import os 
all_files = (open(f) for f in os.listdir(some_path)) # note() instead of [] 
for f in all_files: 
    pass # do something with the open file here. 

, 당신이 그들을 완료하면 사용자가 파일을 닫고 확인하십시오. 파이썬 3.3 이상으로 업그레이드 할 수 있다면, 더 많은 편의를 위해 ExitStack을 사용할 것을 권장합니다.

+0

두 번째 것은 내가 찾고 있던 것입니다. ie 개별적으로 각 파일 이름을 입력 할 필요가 없습니다. 고맙습니다. – VivekGhosh

+1

그리고'os.listdir'은 제대로 열리지 않는 디렉토리를 반환 할 것이므로,'os .path.isfile' 또는 귀하의 예제에 해당하는 ... –

+0

@JonClements 대상 디렉토리 내에 디렉토리가 없다는 것을 단순함으로 가정하고 있었지만, 그 사실을 기록 할 것입니다. –

1

os 라이브러리 (특히 listdir는) 기본 도구를 제공해야 당신이 필요합니다

분명히
import os 
print("\n".join(os.listdir())) # returns all of the files (& directories) in the current directory 

당신이 그들과 함께 open를 호출 할 수 있습니다,하지만이 반복 가능한 당신에게 파일을 제공합니다 양식 (나는 당신이 직면하고있는 이슈의 핵심이라고 생각합니다). 이 시점에서 for 루프를 수행하고 모든 루프를 열 수 있습니다.

빠른주의 사항 : Jon Clements는 파일과 함께 os.listdir에 표시 될 디렉토리에주의해야한다는 Henry Keiter의 답변에 대해 지적했습니다.

또한 올바른 필터링 종류 만 열려고하는지 확인하기 위해 몇 가지 필터링 문을 작성하는 것이 좋습니다. 디렉토리에 .txt 파일 만있을 것이라고 생각할 수도 있지만 언젠가는 운영체제 (또는 사용자)가 뭔가 다른 것을 넣는 영리한 생각을 갖고 코드에 렌치를 던질 수 있습니다. .내가 일을 확인하고 있지 않다

import os,re 
scripts=re.compile(".*\.py$") 
files=[open(x,'r') for x in os.listdir() if os.path.isfile(x) and scripts.match(x)] 
files=map(lambda x:x.read(),files) 
print("\n".join(files)) 

참고 :

다행히 (난 그냥 정규식 필터를 보여 드리겠습니다) 빠른 필터는 그렇게 할 수 있고, 당신은 그것을 몇 가지 방법을 수행 할 수 있습니다 파일에 액세스 할 수있는 권한이 있는지 여부와 마찬가지로 디렉토리의 파일을 볼 수 있지만 읽을 권한이없는 경우 예외가 발생합니다.