2012-08-05 8 views
6

ho meno di un anno di esperienza di programmazione imparando a conoscere leggere e scrivere file mi sono imbattuto in questo tutorial: http://www.penzilla.net/tutorials/python/fileio/scrittura di un file con Python - '' Anche se non è fatto:" Confondere Me

Il tutorial. offre il seguente esempio come un semplice script per creare e scrivere in un file:

# 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() 

ho copiato il codice e corse attraverso un Python 2.7.3 Shell mi viene richiesto più volte di inserire stringhe, che sono aggiunti ad un. lista che verrà scritta in un file (questo ha senso per me). Quello che non capisco è la condizione per uscire dal ciclo While ("While not done:") . Pensavo che questo significasse che scrivo al prompt per uscire dal ciclo e successivamente scrivere il file, ma non ha alcun effetto. Poi ho pensato che qualsiasi non-stringa inserita al prompt dovrebbe interrompere il ciclo e scrivere il file. Non sono riuscito a interrompere il ciclo; per qualsiasi cosa ho inserito al prompt, mi è stato appena richiesto di nuovo con "Inserisci un nome:".

Rimuovendo il ciclo While e conservando l'istruzione if/else, ho ottenuto il codice per funzionare per un singolo prompt. Qualcuno può dirmi cosa non sto capendo qui? Immagino che sia un concetto abbastanza semplice che non è stato spiegato nel tutorial perché è stato ritenuto ovvio. Poiché "done" è una parola così comune, non sono riuscito a trovare significati specifici di Python per questo.

+10

Quel codice è orribile. Dovresti trovare un altro tutorial. – Daenyth

+2

Quel codice è orribile. Sfida le convenzioni di denominazione, usa una condizione di loop fuorviante e priva di significato, controlla i tipi (ignorando anche l'ereditarietà), è errata (non può mai uscire dal ciclo, a meno che non venga lanciata un'eccezione ma non venga catturata) e insegna una mancanza, ingenua approccio alla gestione delle risorse (dovrebbe usare 'con open (...)', o 'finally: f.close()'). Anche la pagina sembra essere 6 anni non aggiornata. – delnan

+5

Holy Moses, possiamo linciare l'autore di quel tutorial? – favoretti

risposta

2

done viene assegnato una volta sulla linea 3:

done = 0 

Pertanto, questo ciclo il tempo continuerà a ciclo finché fatto è ancora "non 0":

while not done: 

Ie continuerà ad andare in loop per sempre, a meno che non arrivi a una dichiarazione break (riga 11). Sfortunatamente, il codice è difettoso e questo non accadrà mai.

Se si desidera interrompere quando si digita 'done', quindi modificare l'istruzione if a:

if name == "done": 

Ma, essere consapevoli che la stringa letterale done di cui sopra ha nulla a che fare con la variabile done assegnato in precedenza.

2

Non è colpa tua. Questo codice fornisce in nessun modo per interrompere il ciclo.

if name == 'end': 
    break 
3

Vorrei smettere di seguire quel tutorial in questo momento. Il codice non è Pythonic, è troppo complicato e sembra piuttosto obsoleto.

Detto questo, ecco come mi piacerebbe scrivere codice che di esercitazione (sì, lo fa la stessa cosa, ma solo il destra modo):

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

    if not name: 
     break 

    handle.write(name + '\n') 
Problemi correlati