Co oznacza „wb” w tym kodzie przy użyciu Pythona?

107

Kod:

file('pinax/media/a.jpg', 'wb')
zjm1126
źródło
Powinieneś także rozważyć użycie openzamiast file. filezostał uznany za przestarzały w Pythonie 2 (nie można znaleźć wersji) i został usunięty w py3k. (dzięki Scott) Zobacz to pytanie, aby uzyskać więcej informacji.
Luiz Damim
1
Użyj openzamiast file, który został wycofany w Pythonie 2 i usunięty w Pythonie 3. Zobacz stackoverflow.com/questions/112970/ ...
Max Ghenis
2
Zakładanie, że jest to własny kod PO, nie jest naprawdę sprawiedliwe, zwłaszcza biorąc pod uwagę charakter pytania. To było oczywiście ważne w jednym czasie.
mckenzm

Odpowiedzi:

112

Tryb plików , zapis i binarny. Ponieważ piszesz plik .jpg, wygląda dobrze.

Ale jeśli masz przeczytać ten plik jpg, musisz użyć 'rb'

Więcej informacji

W systemie Windows „b” dołączone do trybu otwiera plik w trybie binarnym, więc są też tryby, takie jak „rb”, „wb” i „r + b”. Python w systemie Windows rozróżnia pliki tekstowe i binarne; znaki końca linii w plikach tekstowych są automatycznie nieznacznie zmieniane, gdy dane są odczytywane lub zapisywane. Ta zakulisowa modyfikacja danych plików jest dobra w przypadku plików tekstowych ASCII, ale spowoduje uszkodzenie danych binarnych, takich jak w plikach JPEG lub EXE.

TY
źródło
4
Konkretnie, w systemie Windows plik otwarty w trybie tekstowym fd.write("foo\n")faktycznie zapisuje na dysku foo\r\n(zwróć uwagę na \r).
Serge Ballesta,
4
Jestem prawie pewien, że `` b '' otwiera pliki w trybie binarnym na każdej platformie, nie tylko w systemie Windows, w przeciwnym razie byłoby też ogromne zastrzeżenie.
mckenzm
76

Symbol wbwskazuje, że plik jest otwierany do zapisu w trybie binarnym.

Podczas pisania w trybie binarnym Python nie wprowadza żadnych zmian w danych, gdy są one zapisywane do pliku. Jednak w trybie tekstowym (gdy bjest wykluczone, jak w just wlub gdy określisz tryb tekstowy za pomocą wt), jednak Python zakoduje tekst w oparciu o domyślne kodowanie tekstu. Ponadto Python przekonwertuje zakończenia linii ( \n) na dowolne zakończenie linii specyficzne dla platformy, co mogłoby uszkodzić plik binarny, taki jak exelub png.

Dlatego podczas pisania plików tekstowych należy używać trybu tekstowego (niezależnie od tego, czy używa się zwykłego tekstu, czy formatu tekstowego, takiego jak CSV), natomiast tryb binarny należy używać podczas pisania plików nietekstowych, takich jak obrazy.

Bibliografia:

https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files https://docs.python.org/3/library/functions.html#open

Daniel G.
źródło
1
Z czasem mogło się to zmienić. W systemie Ubuntu 18.04 z Pythonem 3.6.8 „tryb binarny” zdecydowanie miał znaczenie. Wystąpił błąd podczas próby zapisu do pliku tekstowego (format CSV, nie to, że ostatecznie ma to tak duże znaczenie), który został otwarty z wbopcją. Korzystając z tej wopcji, udało mi się sprawić, by działał poprawnie.
TheDavidJohnson
1
Dzięki za komentarz @TheDavidJohnson. W Pythonie 2.6 dokumentacja mówi, że btryb ma wpływ tylko na Windows. Zostało to teraz usunięte z dokumentacji i tryb binarny „powinien być używany dla wszystkich plików, które nie zawierają tekstu”.
Daniel G
1
Jasne, @Daniel! Doceniam, że opublikowałeś swoje rozwiązanie. Ponad 9 lat później jest nadal pomocny. Jak wspaniale to jest? W każdym razie chciałem tylko dodać kilka nowych informacji dla innych, takich jak ja, dla których mogą się pojawić i uznać je za pomocne. Twoje zdrowie!
TheDavidJohnson
Świetne wyjaśnienie. Jednak jedno wyjaśnienie: mówisz: „Dlatego podczas pisania plików tekstowych należy używać trybu tekstowego” . Dla kompletności odniosę się do twojego wcześniejszego komentarza, że ​​"Python nie wprowadza żadnych zmian [w trybie binarnym]" i dodam, że użyjesz trybu binarnego na pliku tekstowym, gdy albo nie wiesz (lub nie obchodzi), jakie jest kodowanie ale wystarczy odczytać lub zapisać bajty, lub jeśli chcesz zachować zakończenia linii niezależnie od platformy.
pcdev
8

To jest tryb, w którym otwierasz plik. „wb” oznacza, że ​​piszesz do pliku (w) i że piszesz w trybie binarnym (b).

Sprawdź dokumentację, aby uzyskać więcej informacji: clicky

GlenCrawford
źródło