2014-07-24 8 views
1

요청한 내용에 따라 최대 3 개의 출력 파일을 제공 할 수있는 사용자 정의 가능한 스크립트가 있습니다. 현재 내가 가지고다른 출력 파일에 조건부로 쓰기

with open("option1", "w") as file1, open("option2", "w") as file2, open("option3", "w") as file3: 

내가하지 않으려는 무엇 인 (때문에 열린 문의) 옵션을 선택하지 않은 경우, 파일이 계속 생성되고있다 실행 해요 문제.

은 순진하게도 내가 생각 내가 원하는 것은 허용 될 다음의 라인을 따라 허용 된 구문입니다

with (if type1: open("option1", "w") as file1), (if type2: open("option2", "w") as file2), (if type3: open("option3", "w") as file3): 

3 개 가지 유형과 해당 옵션은 상호 배타적이지, 더 많은 것을 원하는 것이 일반적이다 파일 유형 중 1 개 이상 type1, type2 및 type3 변수는 기본적으로 False로 설정되고 명령 줄에서 True로 독립적으로 전환되는 부울 값입니다. 전반적으로 나는 효율적으로 빈 파일의 생성을 피하려고 노력하고 있으며, 코드를 상당히 성실하게 변경하여 파일을 완성합니다.

답변

4
filenames_map = {"type1":"option1", "type2":"option2", "type3":"option3"} 
filename = filenames_map.get(type, "default_option") 
with open(filname, "w") as targetFile: 
    # do whatever needs to be done 

dict.get 찾을 그러한 키의 두 번째 인수에 대한 사전 및 기본값에서 값을 가져옵니다.

유형이 상호 배타적이지 않으면 약간 더 까다 롭습니다. 당신이 작성하는 파일의 수를 확인할 수없는 경우

with (context_manager) as something: 
    do_stuff() 

try: 
    context_manager.__enter__() 
    do_stuff() 
finally: 
    context_manager.__exit__() 

그래서, 런타임 때까지, 당신이해야합니다 :이 두 약 equivivalent있는 정상적인 실행 흐름 (예외없이) 아래에 있도록 with는 복합 명령문입니다 컨텍스트를 직접 관리 할 수 ​​있습니다. 다행히도 openFileObject을 반환하고 __enter____exit__ 인 컨텍스트 관리자를 정의합니다. 다행히도 open은 매우 간단한 컨텍스트 관리자 인 FileObject을 반환합니다. documentation에 명시된 바와 같이 당신이 Python3를 사용하는 경우, 당신은 사용할 수

target_files = [] 
# please modify to follow PEP-8 yourself, compressed for clarity 
if user_wants_type1(type): target_files.append("option1") 
if user_wants_type2(type): target_files.append("option2") 
if user_wants_type3(type): target_files.append("option3") 

try: 
    handles = [open(filename) for filename in taget_files] 
    for handle in handles: 
     handle.write("something") 
finally: 
    for handle in handles: 
     handle.close() 
+0

이것으로 몇 가지 테스트를 시도하고 있지만이 파일은 하나의 파일에만 쓸 수있는 것 같습니다.또한 type1, type2 및 type3은 기본적으로 False이며 지정된 값으로 설정된 단일 변수가 아니라 명령 행에서 True로 설정됩니다. 여러 파일에 쓰기를 허용하도록 업데이트 된 @ – ded

+0

의 일부를 반영하여 질문을 업데이트합니다. 별개의 변수로'type1','type2','type3'을 사용하기 위해서는'user_wants_typeN (type) : ...'을'if typeN : ... '으로 대체하십시오. – J0HN

+0

이것은 다소 좋지만 여전히 제한적입니다. 각 핸들은 별도로 열리므로 3 개의 핸들 각각에 대해 동일한 "무언가"를 단계별로 실행해야합니다. 나는 그것에 대해 어떤 제안도하고 싶지만, 나는 "무언가"를 다시 만드는쪽으로 기울어 져서 3 가지 다른 유형으로 분류 될 것이다. – ded

0

한 번에 두 가지 유형이 될 수 있습니까? 그렇지 않다면 다음과 같이 파일을 작성하기 전에 조건부를 설정해야합니다.

if type1: 
    fname = "option1" 
elif type2: 
    fname = "option2" 
elif type3: 
    fname = "option3" 

with open(fname, "w") as outfile: 
    outfile.write("ok!") 
+0

3 가지 유형은 상호 배타적이지 않습니다. 누군가는 모든 3 가지 유형의 조합을 원할 수 있습니다. 일반적으로 옵션 2와 3은 함께 선택되지만 반드시 필요하지는 않습니다. – ded

0

개방하기 전에 파일을 알아낼 것입니다.

if type1: 
    filename = "option1" 
elif type2: 
    filename = "option2" 
elif type3: 
    filename = "option3" 

with open(filename, 'w') as outfile: 
    #do stuff 
+0

3 가지 유형은 상호 배타적이지 않습니다. 다른 말로하면, 누군가는 모든 3 가지 유형의 조합을 원할 수 있습니다. – ded

1

with open("hello.txt") as f: 
    for line in f: 
     print line, 

는 점에 지금

f = open("hello.txt") 
try: 
    for line in f: 
     print line, 
finally: 
    f.close() 

같음 contextlib.ExitStack:

import contextlib 
filenames = ['option{}'.format(i) for i in range(1,4)] 
types = [type1, type2, type3] 

with contextlib.ExitStack() as stack: 
    files = [stack.enter_context(open(filename, 'w')) 
      for filename, typ in zip(filenames, types) if typ] 

Python2의 경우 contextlib2 module을 사용할 수 있습니다.