Aviso: Python 2.7+
Hoje descobri que é possível gerenciar vários objetos em um context manager sem a necessidade de aninhar várias cláusulas with. Ou seja, pude transformar o código¹ que eu estava escrevendo de:
def ajeita_csv(path):
with open(path, 'r') as fr:
with open('u' + path, 'w') as fw:
reader, writer = csv.reader(fr), csv.writer(fw)
for row in reader:
for i in range(3, len(row), 5):
new_row = row[:3] + row[i:i+5]
writer.writerow(new_row)
para:
def ajeita_csv(path):
with open(path, 'r') as fr, open('u' + path, 'w') as fw:
reader, writer = csv.reader(fr), csv.writer(fw)
for row in reader:
for i in range(3, len(row), 5):
new_row = row[:3] + row[i:i+5]
writer.writerow(new_row)
Ou seja, é possível gerenciar a abertura/fechamento de vários objetos/recursos em uma única cláusula with, separando os objetos por uma vírgula.
Fica a dica.
¹Código para dar uma ajustada em um CSV desformatado, que tinha vários registros por linha.