python open wbudowana funkcja: różnica między trybami a, a+, w, w+ i r+?

W Pythonie wbudowanym open , jaka jest dokładna różnica między trybami w, a, w+, a+, i r+?

W szczególności, dokumentacja zakłada, że wszystkie z nich umożliwią zapis do pliku i mówi, że otwiera pliki w celu" dodania"," zapisu "i" aktualizacji", ale nie określa, co oznaczają te terminy.

 426
Author: Simon, 2009-09-23

6 answers

Tryby otwarcia są dokładnie takie same jak w przypadku funkcji biblioteki standardowej Cfopen().

Strona podręcznika BSDfopen definiuje je w następujący sposób:

 The argument mode points to a string beginning with one of the following
 sequences (Additional characters may follow these sequences.):

 ``r''   Open text file for reading.  The stream is positioned at the
         beginning of the file.

 ``r+''  Open for reading and writing.  The stream is positioned at the
         beginning of the file.

 ``w''   Truncate file to zero length or create text file for writing.
         The stream is positioned at the beginning of the file.

 ``w+''  Open for reading and writing.  The file is created if it does not
         exist, otherwise it is truncated.  The stream is positioned at
         the beginning of the file.

 ``a''   Open for writing.  The file is created if it does not exist.  The
         stream is positioned at the end of the file.  Subsequent writes
         to the file will always end up at the then current end of file,
         irrespective of any intervening fseek(3) or similar.

 ``a+''  Open for reading and writing.  The file is created if it does not
         exist.  The stream is positioned at the end of the file.  Subse-
         quent writes to the file will always end up at the then current
         end of file, irrespective of any intervening fseek(3) or similar.
 522
Author: drAlberT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-03 15:55:03

Zauważyłem, że od czasu do czasu muszę od nowa Googlować fopen, aby zbudować mentalny obraz podstawowych różnic między trybami. Więc myślałem, że diagram będzie szybszy do przeczytania następnym razem. Może ktoś inny uzna to za pomocne.

 320
Author: Andrzej Pronobis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-01 05:13:40

Te same informacje, tylko w formie tabeli

                  | r   r+   w   w+   a   a+
------------------|--------------------------
read              | +   +        +        +
write             |     +    +   +    +   +
write after seek  |     +    +   +
create            |          +   +    +   +
truncate          |          +   +
position at start | +   +    +   +
position at end   |                   +   +

Gdzie znaczenia są: (aby uniknąć błędnej interpretacji)

  • odczyt-odczyt z pliku jest dozwolony
  • Zapis-zapis do pliku jest dozwolony

  • Create-plik jest tworzony, jeśli jeszcze nie istnieje

  • Trunctate - podczas otwierania pliku jest on pusty (cała zawartość pliku jest kasowana)

  • Position at start-po otwarciu pliku, pozycja początkowa jest ustawiony na początek pliku

  • pozycja na końcu - po otwarciu pliku początkowa pozycja jest ustawiana na koniec pliku

Uwaga: a i a+ zawsze dołączają do końca pliku-ignoruje wszelkie ruchy seek.
BTW. ciekawe zachowanie przynajmniej na moim win7 / python2. 7, dla nowego pliku otwartego w trybie a+:
write('aa'); seek(0, 0); read(1); write('b') - drugi {[6] } jest ignorowany
write('aa'); seek(0, 0); read(2); write('b') - drugi write IOError

 129
Author: industryworker3595112,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-28 07:22:02

Opcje są takie same jak dla funkcji fopen w bibliotece standardowej C:

w obcina plik, nadpisując to, co już było

a dołącza do pliku, dodając do tego co już było

w+ otwiera się do odczytu i zapisu, obcinając plik, ale także pozwalając odczytać to, co zostało zapisane do pliku

a+ otwiera się do dodawania i czytania, pozwalając zarówno na dołączanie do pliku, jak i odczytywanie jego spis treści

 36
Author: Eli Courtwright,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-23 13:33:37

Wpadłem na to próbując dowiedzieć się, dlaczego używasz trybu 'w+' kontra 'w'. W końcu zrobiłem kilka testów. Nie widzę zbyt dużego celu dla trybu ' w+', ponieważ w obu przypadkach plik jest obcięty na początek. Jednak za pomocą "w+" można było przeczytać po napisaniu, szukając ponownie. Jeśli spróbujesz czytać z 'w', rzuci to IOError. Czytanie bez użycia seek z trybem 'w+' nic nie da, ponieważ wskaźnik pliku będzie po tym, gdzie napisałeś.

 7
Author: Wyrmwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-21 21:05:27

Myślę, że jest to ważne do rozważenia w przypadku realizacji wieloplatformowej, tj. jako CYA. :)

W systemie Windows, ' B 'dołączony do trybu otwiera plik w trybie binarnym, więc istnieją również tryby takie jak 'RB',' wb 'i'R+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. Ta zakulisowa modyfikacja danych plików jest dobra dla plików tekstowych ASCII, ale będzie uszkodzone dane binarne, takie jak w plikach JPEG lub EXE. Należy bardzo uważać, aby używać trybu binarnego podczas odczytu i zapisu takich plików. Na Unixie nie zaszkodzi dopisać " b " do trybu, więc można go używać niezależnie dla wszystkich plików binarnych.

To jest bezpośrednio cytowane z Python Software Foundation 2.7.x .

 6
Author: Goran B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-05 01:51:52