Estou vendo como fazer entrada e saída de arquivos em Python. Escrevi o código a seguir para ler uma lista de nomes (um por linha) de um arquivo para outro arquivo, verificando um nome com relação aos nomes no arquivo e anexando texto às ocorrências no arquivo. O código funciona. Poderia ser feito melhor?
Eu queria usar a with open(...
instrução para os arquivos de entrada e saída, mas não consigo ver como eles podem estar no mesmo bloco, o que significa que eu precisaria armazenar os nomes em um local temporário.
def filter(txt, oldfile, newfile):
'''\
Read a list of names from a file line by line into an output file.
If a line begins with a particular name, insert a string of text
after the name before appending the line to the output file.
'''
outfile = open(newfile, 'w')
with open(oldfile, 'r', encoding='utf-8') as infile:
for line in infile:
if line.startswith(txt):
line = line[0:len(txt)] + ' - Truly a great person!\n'
outfile.write(line)
outfile.close()
return # Do I gain anything by including this?
# input the name you want to check against
text = input('Please enter the name of a great person: ')
letsgo = filter(text,'Spanish', 'Spanish2')
filter()
é uma função interna e, portanto, você provavelmente deve escolher um nome diferente para sua função.filter()
), ela será encontrada antes da incorporada.filter()
Respostas:
Python permite colocar várias
open()
instruções em um únicowith
. Você os separa por vírgula. Seu código seria então:E não, você não ganha nada colocando um explícito
return
no final de sua função. Você pode usarreturn
para sair mais cedo, mas você o teve no final, e a função sairá sem ele. (Obviamente, com funções que retornam um valor, use oreturn
para especificar o valor a ser retornado.)O uso de vários
open()
itens comwith
não era suportado no Python 2.5 quando awith
instrução foi introduzida ou no Python 2.6, mas é suportado no Python 2.7 e Python 3.1 ou mais recente.http://docs.python.org/reference/compound_stmts.html#the-with-statement http://docs.python.org/release/3.1/reference/compound_stmts.html#the-with-statement
Se você estiver escrevendo um código que deve ser executado no Python 2.5, 2.6 ou 3.0, aninhe as
with
instruções como as outras respostas sugeridas ou usadascontextlib.nested
.fonte
Use blocos aninhados como este,
fonte
Você pode aninhar o seu com blocos. Como isso:
Isso é melhor que a sua versão, porque você garante que
outfile
será fechado mesmo que seu código encontre exceções. Obviamente, você poderia fazer isso com try / finalmente, maswith
é o caminho certo para fazer isso.Ou, como acabei de aprender, você pode ter vários gerenciadores de contexto em uma declaração with, conforme descrito por @steveha . Isso me parece ser uma opção melhor do que aninhar.
E para sua última pergunta menor, o retorno não serve a nenhum propósito real. Eu o removeria.
fonte
Às vezes, convém abrir uma quantidade variável de arquivos e tratar cada um da mesma forma, você pode fazer isso com
contextlib
fonte