Estoy viendo cómo hacer la entrada y salida de archivos en Python. Escribí el siguiente código para leer una lista de nombres (uno por línea) de un archivo a otro archivo mientras verifico un nombre con los nombres en el archivo y anexo texto a las ocurrencias en el archivo. El código funciona ¿Se podría hacer mejor?
Quería usar la with open(...
declaración para los archivos de entrada y salida, pero no puedo ver cómo podrían estar en el mismo bloque, lo que significa que necesitaría almacenar los nombres en una ubicación temporal.
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()
es una función incorporada, por lo que probablemente debería elegir un nombre diferente para su función.filter()
), se encontrará antes del incorporadofilter()
Respuestas:
Python permite poner múltiples
open()
declaraciones en una solawith
. Los separas por coma. Su código sería entonces:Y no, no gana nada poniendo un explícito
return
al final de su función. Puede usarreturn
para salir temprano, pero lo tenía al final, y la función saldrá sin él. (Por supuesto, con funciones que devuelven un valor, se usareturn
para especificar el valor a devolver).El uso de varios
open()
elementos conwith
no era compatible con Python 2.5 cuandowith
se introdujo la declaración, o con Python 2.6, pero sí con Python 2.7 y Python 3.1 o posterior.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
Si está escribiendo código que debe ejecutarse en Python 2.5, 2.6 o 3.0, anide las
with
declaraciones como las otras respuestas sugieren o usecontextlib.nested
.fuente
Use bloques anidados como este,
fuente
Puedes anidar tu con bloques. Me gusta esto:
Esto es mejor que su versión porque garantiza que
outfile
se cerrará incluso si su código encuentra excepciones. Obviamente, podría hacerlo con try / finally, perowith
es la forma correcta de hacerlo.O, como acabo de aprender, puede tener múltiples gestores de contexto en una declaración with como lo describe @steveha . Eso me parece una mejor opción que anidar.
Y para su última pregunta menor, la devolución no tiene ningún propósito real. Lo quitaría
fuente
A veces, es posible que desee abrir una cantidad variable de archivos y tratar a cada uno de la misma manera, puede hacerlo con
contextlib
fuente