2012-08-05 28 views
6

tengo menos de un año de experiencia en programación mientras aprenden acerca de la lectura y escritura de archivos me encontré con este tutorial: http://www.penzilla.net/tutorials/python/fileio/escribir en un archivo con Python - '' Si bien no se ha hecho:" La confusión me

El tutorial. ofrece el siguiente ejemplo como un simple script para crear y escribir en un archivo:

# Let's create a file and write it to disk. 
filename = "test.dat" 
# Let's create some data: 
done = 0 
namelist = [] 
while not done: 
    name = raw_input("Enter a name:") 
    if type(name) == type(""): 
     namelist.append(name) 
    else: 
     break 

# Create a file object: 
# in "write" mode 
FILE = open(filename,"w") 

# Write all the lines at once: 
FILE.writelines(namelist) 

# Alternatively write them one by one: 
for name in namelist: 
    FILE.write(name) 

FILE.close() 

he copiado el código y corrió a través de un Python 2.7.3 Shell me pide repetidamente para introducir cadenas que se anexan a una. lista que se escribirá en un archivo (esto tiene sentido para mí). Lo que no entiendo es la condición para salir del ciclo While ("While not done:") . Pensé que esto significaba que escribo hecho en el prompt para salir del ciclo y luego escribir el archivo, pero hecho no tiene ningún efecto. Entonces pensé que cualquier cadena que no se ingresara en el prompt debería romper el ciclo y escribir el archivo. No pude hacer que el ciclo se rompiera en absoluto; para cualquier cosa que ingresé en el prompt, me volvieron a preguntar con "Enter a name:".

Al eliminar el ciclo While y conservar la instrucción if/else, obtuve el código para que funcione con un solo mensaje. ¿Puede alguien decirme lo que no estoy entendiendo aquí? Supongo que es un concepto bastante simple que no se explicó en el tutorial porque se suponía que era obvio. Como "hecho" es una palabra tan común, no pude encontrar ningún significado específico de Python para ella.

+10

Ese código es horrible. Deberías encontrar otro tutorial. – Daenyth

+2

Ese código es horrible. Desafía convenciones de nomenclatura, utiliza una condición de bucle engañosa y sin sentido, comprueba tipos (sin tener en cuenta la herencia), está mal (nunca puede salir del bucle, a menos que se produzca una excepción pero no se capte) y enseña que falta, ingenuo acercamiento a la gestión de recursos (debería usar 'con open (...)', o 'finally: f.close()'). Además, la página parece tener 6 años de antigüedad. – delnan

+5

Holy Moses, ¿podemos linchar al autor de ese tutorial? – favoretti

Respuesta

2

done se asigna una vez en la línea 3:

done = 0 

Por lo tanto, este bucle al mismo tiempo que seguirá bucle mientras hecho sigue siendo "not 0":

while not done: 

Ie continuará dando vueltas para siempre, a menos que llegue a una declaración break (línea 11). Desafortunadamente, el código es defectuoso y eso nunca sucederá.

Si desea detener cuando se escribe 'Done', a continuación, cambiar la sentencia if para:

if name == "done": 

embargo, ser conscientes de que la cadena literal done anterior tiene nada que ver con la variable done asignado antes.

2

No es tu culpa. Ese código proporciona de ninguna manera para salir del circuito.

if name == 'end': 
    break 
3

Dejo de seguir ese tutorial en este momento. El código no es Pythonic, es demasiado complicado y parece estar bastante desactualizado.

Dicho esto, así es como me gustaría escribir el código de ese tutorial (sí, se hace lo mismo, pero sólo el derecho ida):

with open('test.dat', 'w') as handle: 
    while True: 
    name = raw_input('Enter a name: ') 

    if not name: 
     break 

    handle.write(name + '\n') 
Cuestiones relacionadas