Otwieraj pliki w trybach „rt” i „wt”

109

Kilka razy na SO widziałem ludzi używających trybów rti wtdo czytania i zapisywania plików.

Na przykład:

with open('input.txt', 'rt') as input_file:
     with open('output.txt', 'wt') as output_file: 
         ...

Nie widzę udokumentowanych trybów , ale ponieważ open()nie generuje błędu - wygląda na to, że jest prawie legalny w użyciu.

Do czego służy i czy jest jakaś różnica między using wtvs wi rtvs r?

alecxe
źródło

Odpowiedzi:

194

todnosi się do trybu tekstowego. Nie ma różnicy między ri rtlub wi, wtponieważ tryb tekstowy jest trybem domyślnym.

Udokumentowane tutaj :

Character   Meaning
'r'     open for reading (default)
'w'     open for writing, truncating the file first
'x'     open for exclusive creation, failing if the file already exists
'a'     open for writing, appending to the end of the file if it exists
'b'     binary mode
't'     text mode (default)
'+'     open a disk file for updating (reading and writing)
'U'     universal newlines mode (deprecated)

Tryb domyślny to 'r'(otwarty do czytania tekstu, synonim 'rt').

devnull
źródło
4
Rozumiem, jest to udokumentowane w dokumentach python3. Więc w zasadzie nie ma różnicy między wtvs wi rtvs r- tylko explicit is better than implicit?
alecxe
@alecxe Racja, ponieważ tryb tekstowy jest domyślny, nie ma różnicy między ri rt...
devnull
9
Zauważ, że wnie zawsze jest równe wt. Jednym z takich przypadków jest gzip.opentryb binarny, a nie tryb tekstowy. Powiązane pytanie: stackoverflow.com/questions/42013083/…
Carl Ekerot
9

tWskazuje tryb tekstowy, co oznacza, że \nznaki będą tłumaczone do zakończeń linii hosta OS podczas pisania do pliku i ponownie podczas czytania. Flaga jest w zasadzie tylko szumem, ponieważ tryb tekstowy jest domyślny.

Poza Utym te flagi trybu pochodzą bezpośrednio z funkcji standardowej biblioteki C fopen(), co jest udokumentowane w szóstym akapicie dokumentacji python2 dla open().

O ile wiem, tnie jest i nigdy nie był częścią standardu C, więc chociaż wiele implementacji biblioteki C i tak go akceptuje, nie ma gwarancji, że wszystkie będą, a zatem nie ma gwarancji, że będzie działać na każdej kompilacji pyton. To wyjaśnia, dlaczego dokumentacja python2 tego nie wymieniła i dlaczego i tak generalnie działała. Dokumentacja python3 czyni to oficjalnym.

ʇsәɹoɈ
źródło
4

Litera „r” służy do czytania, „w” do pisania, a „a” do dołączania.

„T” oznacza tryb tekstowy w połączeniu z trybem binarnym.

Kilka razy w SO widziałem ludzi używających trybów rt i wt do czytania i zapisywania plików.

Edycja: Czy na pewno widziałeś rt, a nie rb?

Te funkcje generalnie zawijają funkcję fopen, która jest opisana tutaj:

http://www.cplusplus.com/reference/cstdio/fopen/

Jak widać, wspomina o użyciu b do otwierania pliku w trybie binarnym.

Podane łącze do dokumentu odnosi się również do tego trybu b:

Dołączenie „b” jest przydatne nawet w systemach, które nie traktują inaczej plików binarnych i tekstowych, gdzie służy jako dokumentacja.

jussij
źródło
Tak, to było ewidentnie rt, np. Stackoverflow.com/questions/10971033/… lub stackoverflow.com/questions/17127853/… itd. Dziękuję za informację, dobrze wiedzieć.
alecxe
W linku, który devnull udostępnia opcję tekstu „t” jest wymieniona. Zaskoczyło mnie to, że link do C ++ nie wspomniał również o opcji „t”, ponieważ jestem prawie pewien, że użyłem opcji „rt” i „wt” w kodzie C fopen napisanym lata temu.
jussij
Tak, dlatego zapytałem - to było dla mnie jak nieudokumentowana funkcja. Mam nadzieję, że ten wątek pomoże komuś w przyszłości. Dzięki jeszcze raz.
alecxe
3

t wskazuje na text mode

https://docs.python.org/release/3.1.5/library/functions.html#open

w systemie Linux nie ma różnicy między trybem tekstowym a binarnym, jednak w systemie Windows konwertuje się \nna \r\ntryb tekstowy when.

http://www.cygwin.com/cygwin-ug-net/using-textbinary.html

ymonad
źródło
5
W Pythonie 3 istnieje dodatkowa różnica między trybami plików tekstowych i binarnych (na wszystkich platformach). W trybie tekstowym readzwraca ciągi Unicode. W trybie binarnym readzwraca bytesinstancję. Jeśli chcesz napisać kod Python 2 z myślą o kompatybilności w przód, możesz użyć io.openzamiast standardu, openaby uzyskać zachowanie Python 3 (z unicodekontra strinstancjami).
Blckknght