W pytona wbudowanym otwartym funkcją, jaka jest dokładna różnica między trybami w
, a
, w+
, a+
, i r+
?
W szczególności dokumentacja implikuje, że wszystkie one pozwolą na zapis do pliku i mówi, że otwiera pliki do „dołączania”, „pisania” i „aktualizowania”, ale nie określa, co oznaczają te terminy.
Odpowiedzi:
Tryby otwarcia są dokładnie takie same, jak dla funkcji standardowej biblioteki C
fopen()
.BSD
fopen
podręcznika definiuje je następująco:źródło
w
iw+
oboje mogą to zrobićThe file is created if it does not exist
b
dołączany do trybu otwiera plik w trybie binarnym, więc istnieje również tryby takie jakrb
,wb
ir+b
. Python w systemie Windows rozróżnia pliki tekstowe i binarne; znaki końca wiersza w plikach tekstowych są automatycznie nieznacznie zmieniane podczas odczytu lub zapisu danych.+
nie robi czegoś spójnego niezależnie, jeśli tak jesta
,w
czyr
? A może nie widzę wzoru? Jaki jest wzór?Zauważyłem, że od czasu do czasu muszę ponownie otwierać Google, aby stworzyć mentalny obraz podstawowych różnic między trybami. Pomyślałem więc, że następnym razem będzie szybciej czytać diagram. Może ktoś inny również uzna to za pomocne.
źródło
a
Opis jest źle . Zapisy są zawsze umieszczane na końcu.Subsequent writes to the file will always end up at the then current end of file, irrespective of any intervening fseek(3) or similar
która jest nieco silniejsza niż zwykłe stwierdzenie, że początkowa pozycja to koniec.Te same informacje, tylko w formie tabeli
gdzie są znaczenia: (aby uniknąć błędnej interpretacji)
write - zapis do pliku jest dozwolony
Utwórz - plik jest tworzony, jeśli jeszcze nie istnieje
trunctate - podczas otwierania pliku jest pusty (cała zawartość pliku jest kasowana)
pozycja na początku - po otwarciu pliku pozycja początkowa jest ustawiana na początek pliku
Uwaga:
a
ia+
zawsze dołączaj na końcu pliku - ignoruje wszelkieseek
ruchy.BTW. ciekawe zachowanie przynajmniej na moim win7 / python2.7, dla nowego pliku otwartego w
a+
trybie:write('aa'); seek(0, 0); read(1); write('b')
- drugiwrite
jest ignorowanywrite('aa'); seek(0, 0); read(2); write('b')
- drugiwrite
podnosiIOError
źródło
open(file,'a'); close(); open(file,'r+')
aby to osiągnąć.a
ia+
zapisy zawsze będą się pojawiać na końcu pliku, niezależnie od tego, czy ręcznie przesuwasz wskaźnik za pomocąseek()
.Opcje są takie same jak dla funkcji fopen w standardowej bibliotece C:
w
obcina plik, zastępując wszystko, co już tam byłoa
dołącza się do pliku, dodając do wszystkiego, co już tam byłow+
otwiera się do odczytu i zapisu, obcinając plik, ale także umożliwiając odczytanie tego, co zostało zapisane do plikua+
otwiera się do dołączania i czytania, umożliwiając zarówno dołączenie do pliku, jak i odczytanie jego zawartościźródło
Myślę, że należy to wziąć pod uwagę przy realizacji na wielu platformach, tj. Jako CYA. :)
Jest to bezpośrednio notowane od Python Software Foundation 2.7.x .
źródło
Zastanawiam się nad tym, próbując dowiedzieć się, dlaczego miałbyś używać trybu „w +” kontra „w”. W końcu właśnie przeprowadziłem testy. Nie widzę większego sensu dla trybu „w +”, ponieważ w obu przypadkach plik jest na początku obcięty. Jednak dzięki „w +” możesz czytać po napisaniu, szukając wstecz. Jeśli spróbujesz czytać z „w”, spowoduje to IOError. Czytanie bez korzystania z trybu wyszukiwania w trybie „w +” nic nie da, ponieważ wskaźnik pliku będzie po tym, co napisałeś.
źródło