2012-08-05 9 views
6

Mam mniej niż rok doświadczenia w programowaniu podczas poznawania odczytu i zapisu plików natknąłem tym tutorialu: http://www.penzilla.net/tutorials/python/fileio/Zapis do pliku z Pythona - „” Choć nie zrobił:”Mylenie Me

samouczka. oferuje następujący przykład jako prosty skrypt do tworzenia i zapisywania do pliku:

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

skopiowałem ten kod i prowadził go przez Python 2.7.3 Shell jestem poproszony aby wprowadzić ciągi, które są dołączone do a. lista, która zostanie zapisana do pliku (to ma dla mnie sens) .Co nie rozumiem, jest warunkiem wyjścia z pętli While ("While not done:") . Pomyślałem, że to oznacza, że ​​wpisuję tekst done na monicie, aby wyjść z pętli, a następnie napisać plik, ale zrobione nie ma żadnego efektu. Wtedy pomyślałem, że wszelkie niepodpisane w wierszu polecenia powinny przerwać pętlę i napisać plik. Nie mogłem w ogóle złamać pętli; dla czegokolwiek, co wpisałem przy monicie, zostałem poproszony ponownie o "Wprowadź nazwę:".

Po usunięciu pętli While i zachowaniu instrukcji if/else otrzymałem kod, aby działał z pojedynczym monitem. Czy ktoś może mi powiedzieć, czego tu nie rozumiem? Zgaduję, że jest to dość prosta koncepcja, która nie została wyjaśniona w tutorialu, ponieważ zakładano, że jest oczywista. Ponieważ słowo "done" jest tak powszechnym słowem, nie byłem w stanie znaleźć dla niego żadnych specyficznych dla Pythona znaczeń.

+10

Ten kod jest straszne. Powinieneś znaleźć inny samouczek. – Daenyth

+2

Ten kod jest okropny. wymyka się ona nazewnictwa, używa mylących i bezsensowny stan zapętlenia, sprawdza typy (pomijając dziedziczenie też), jest niewłaściwy (nigdy nie może wyjść z pętli, chyba że jest wyjątek, ale to nie byłby złapany) i nie uczy brakuje, naiwny podejście do zarządzania zasobami (powinno używać 'z otwartym (...)' lub 'finally: f.close()'). Również strona wydaje się być 6 lat nieaktualna. – delnan

+5

Święty Mojżeszu, czy możemy zliniować autora tego samouczka? – favoretti

Odpowiedz

2

done jest przypisany raz na linii 3:

done = 0 

Dlatego ten czas Pętla będzie pętli tak długo jak gotowe jest nadal "nie 0":

while not done: 

Ie pozostanie w pętli na zawsze, chyba że trafi on w instrukcję break (wiersz 11). Niestety, kod jest wadliwy i nigdy nie nastąpi.

Jeśli chcesz zatrzymać po wpisaniu „Gotowe”, a następnie zmienić if do:

if name == "done": 

Ale należy pamiętać, że ciągiem znaków done powyżej ma nic do czynienia ze zmienną done przypisane wcześniej.

2

To nie twoja wina. Ten kod zapewnia nie sposób, aby wyrwać się z pętli.

if name == 'end': 
    break 
3

Chciałbym przestać obserwować ten tutorial już teraz. Kod nie jest Pythoniczny, jest zbyt skomplikowany i wydaje się dość przestarzały.

Mając na uwadze powyższe, oto jak bym napisać kod, który w tutorialu (tak, to robi to samo, ale tylko prawo sposób):

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

    if not name: 
     break 

    handle.write(name + '\n')