2014-11-13 13 views
8

To jest z exercise 16 z tutoriali Zed Shaw Python. Trudno mi zrozumieć, co dokładnie robi funkcja truncate. Logika polega na tym, że otwieramy plik, a następnie ... skracamy go? Po co? Co dokładnie się tutaj dzieje?Zachowanie metody przycinania() w języku Python

from sys import argv 

script, filename = argv 

print "We're going to erase %r." % filename 
print "If you don't want that, hit CTRL-C (^C)." 
print "If you do want that, hit RETURN." 

raw_input("?") 

print "Opening the file..." 
target = open(filename, 'w') 

print "Truncating the file. Goodbye!" 
target.truncate() 

print "Now I'm going to ask you for three lines." 

line1 = raw_input("line 1: ") 
line2 = raw_input("line 2: ") 
line3 = raw_input("line 3: ") 

print "I'm going to write these to the file." 

target.write(line1 + "\n" + line2 + "\n" + line3 + "\n") 

print "And finally, we close it." 
target.close() 
+2

Czy śledziłeś ćwiczenia pięć? Czego dokładnie nie rozumiesz? – jonrsharpe

Odpowiedz

15

Masz rację, podejrzewając.

Najpierw file.truncate robi to:

Obciąć rozmiaru pliku. Jeśli opcjonalny argument rozmiar jest obecny, plik jest obcinany do (najwyżej) tego rozmiaru. Rozmiar domyślnie przyjmuje bieżącą pozycję ...

Nie całkiem taki sam jak opis Zeda - to tylko "opróżnia plik", jeśli aktualna pozycja jest początkiem pliku - ale ponieważ właśnie otworzyliśmy plik (i nie w trybie a), aktualna pozycja jest początkiem, więc nie ma to znaczenia. Obcinamy pusty plik.

Który jest wszystko dobrze, z wyjątkiem tego open już to robi:

najczęściej używanych wartości trybie są 'r' do czytania, 'w' do pisania (obcinanie plik jeśli już istnieje) ...

Otwieramy plik, tworząc go, jeśli nie istnieje i przycinając go do 0 bajtów, jeśli tak się stanie. Następnie, w następnym wierszu, skracamy go do 0 bajtów.

(To „Obcinanie plik. Do widzenia!” Wiadomość jest dość mylące, ponieważ mamy już obcięty go. Wyobraź sobie, umieścić punkt przerwania na tej linii i postanowił zabić program przed wykonaniem go ...)

Ale zauważ, że Zed nie jest głupim błędem; Wydaje się, że zrobili to specjalnie, aby punkt w gabinecie wiertniczej # 5:

Jeśli otworzysz plik z trybu 'w', to czy naprawdę potrzebujemy target.truncate()? Przeczytaj dokumentację dotyczącą funkcji Pythona open i sprawdź, czy to prawda.

+1

Co więcej, wprowadza to w błąd, co również nieznacznie zmniejsza przenośność programu bez ważnego powodu, ponieważ niektóre starsze * nix i niektóre platformy inne niż Windows/nie * * * nie mają funkcji "skracania" w Pythonie 2.x ... – abarnert

0

W tej chwili przechodzę do książki Zeda Shawa. Często. kiedy daje ci takie problemy, zachęca cię do rozmyślania z różnymi elementami twojego kodu, aby zobaczyć, co robią. Możesz usunąć takie rzeczy jak target.truncate() i ponownie uruchomić program. Jak mówi Abarnert, istnieje sposób, aby przyciąć tylko usunąć część pliku. Pozostawienie tej dziury w twojej wiedzy, jak uzyskać różne wyniki za pomocą tych dwóch opcji, ma na celu irytować cię do robienia niezależnych badań. To bardzo skuteczny sposób infekowania czytelnika ciekawością. Zobacz, jak działa append w Pythonie i zobacz, czy możesz przyciąć() usunąć tylko ostatnią linię twojego pliku testowego. Nie bój się złamać kodu. "Jeśli chcesz zwiększyć wskaźnik sukcesu, podwaj swój wskaźnik niepowodzenia." (Thomas J. Watson, były dyrektor generalny IBM)