나는 한 번에 파일의 몇 가지를 변경하려면 IFF에 내가 그들 모두에 쓸 수 있습니다. 어떻게 든 여러 개의 열린 호출을 with
진술 과 결합 할 수 있는지 궁금합니다 .
try:
with open('a', 'w') as a and open('b', 'w') as b:
do_something()
except IOError as e:
print 'Operation failed: %s' % e.strerror
이것이 가능하지 않다면이 문제에 대한 우아한 해결책은 무엇입니까?
답변
파이썬 2.7 (또는 각각 3.1)부터 쓸 수 있습니다
with open('a', 'w') as a, open('b', 'w') as b:
do_something()
이전 버전의 Python에서는 때때로 contextlib.nested()
컨텍스트 관리자를 중첩 하는 데 사용할 수 있습니다
. 다중 파일을 열 때 예상대로 작동하지 않습니다. 자세한 내용은 링크 된 설명서를 참조하십시오.
드문 경우이지만 동시에 가변 개수의 파일을 열려면 contextlib.ExitStack
Python 버전 3.3부터 사용할 수 있습니다 .
with ExitStack() as stack:
files = [stack.enter_context(open(fname)) for fname in filenames]
# Do something with "files"
대부분의 경우 변수 파일 세트가있는 경우 파일을 하나씩 차례로 열고 싶을 것입니다.
답변
그냥 교체 and
로 ,
하면됩니다 :
try:
with open('a', 'w') as a, open('b', 'w') as b:
do_something()
except IOError as e:
print 'Operation failed: %s' % e.strerror
답변
한 번에 많은 파일을 열거 나 긴 파일 경로를 위해 여러 줄로 나누는 것이 유용 할 수 있습니다. 로부터 파이썬 스타일 가이드 다른 답변에 의견 @Sven Marnach에 의해 제안 :
with open('/path/to/InFile.ext', 'r') as file_1, \
open('/path/to/OutFile.ext', 'w') as file_2:
file_2.write(file_1.read())
답변
내포 된 진술은 똑같은 일을 할 것이며 내 의견으로는 다루기가 더 간단합니다.
inFile.txt가 있고 두 개의 outFile에 동시에 쓰고 싶다고 가정 해 봅시다.
with open("inFile.txt", 'r') as fr:
with open("outFile1.txt", 'w') as fw1:
with open("outFile2.txt", 'w') as fw2:
for line in fr.readlines():
fw1.writelines(line)
fw2.writelines(line)
편집하다:
공감의 이유를 이해하지 못합니다. 답변을 게시하기 전에 코드를 테스트했으며 원하는대로 작동합니다. 질문과 같이 모든 outFile에 씁니다. 중복 쓰거나 쓰지 않습니다. 그래서 나는 왜 내 대답이 잘못된 지, 차선책인지 아닌지 생각합니다.
답변
Python 3.3부터는 모듈 의 클래스 ExitStack
를 사용하여 임의의 수의 파일contextlib
을 안전하게
열 수 있습니다 .
동적 으로 인식되는 상황 인식 객체를 관리 할 수 있으므로 처리 할 파일 수를 모르는 경우 특히 유용 합니다 .
실제로, 설명서에 언급 된 표준 사용 사례는 동적 파일 수를 관리하는 것입니다.
with ExitStack() as stack:
files = [stack.enter_context(open(fname)) for fname in filenames]
# All opened files will automatically be closed at the end of
# the with statement, even if attempts to open files later
# in the list raise an exception
세부 사항에 관심이있는 경우 ExitStack
작동 방법을 설명하기위한 일반적인 예 는 다음과 같습니다.
from contextlib import ExitStack
class X:
num = 1
def __init__(self):
self.num = X.num
X.num += 1
def __repr__(self):
cls = type(self)
return '{cls.__name__}{self.num}'.format(cls=cls, self=self)
def __enter__(self):
print('enter {!r}'.format(self))
return self.num
def __exit__(self, exc_type, exc_value, traceback):
print('exit {!r}'.format(self))
return True
xs = [X() for _ in range(3)]
with ExitStack() as stack:
print(len(stack._exit_callbacks)) # number of callbacks called on exit
nums = [stack.enter_context(x) for x in xs]
print(len(stack._exit_callbacks))
print(len(stack._exit_callbacks))
print(nums)
산출:
0
enter X1
enter X2
enter X3
3
exit X3
exit X2
exit X1
0
[1, 2, 3]
답변
파이썬 2.6에서는 작동하지 않습니다. 여러 파일을 열려면 아래 방법을 사용해야합니다.
with open('a', 'w') as a:
with open('b', 'w') as b:
답변
늦은 답변 (8 세)이지만 여러 파일을 하나로 결합하려는 경우 다음 기능이 도움이 될 수 있습니다.
def multi_open(_list):
out=""
for x in _list:
try:
with open(x) as f:
out+=f.read()
except:
pass
# print(f"Cannot open file {x}")
return(out)
fl = ["C:/bdlog.txt", "C:/Jts/tws.vmoptions", "C:/not.exist"]
print(multi_open(fl))
2018-10-23 19:18:11.361 PROFILE [Stop Drivers] [1ms]
2018-10-23 19:18:11.361 PROFILE [Parental uninit] [0ms]
...
# This file contains VM parameters for Trader Workstation.
# Each parameter should be defined in a separate line and the
...