2013-04-01 20 views
29

Używam moduł ogórkowy w Pythonie i próbuje różnych plików tryby IO:Jaka jest różnica między Rb i R + trybach b w pliku obiektów

# works on windows.. "rb" 
with open(pickle_f, 'rb') as fhand: 
     obj = pickle.load(fhand) 

# works on linux.. "r" 
with open(pickle_f, 'r') as fhand: 
     obj = pickle.load(fhand) 

# works on both "r+b" 
with open(pickle_f, 'r+b') as fhand: 
     obj = pickle.load(fhand) 

nigdy Czytałem o trybie „R + B” w dowolnym miejscu, ale znalazłem wspomnienie o tym w documentation.

Dostaję EOFError w systemie Linux, jeśli używam trybu "rb" oraz w systemie Windows, jeśli użyto "r". Właśnie dałem "r+b" tryb strzał i działa na obu.

Co to jest tryb "r+b"? Jaka jest różnica między "rb" i "r + b"? Dlaczego to działa, gdy inni nie?

+0

Możliwy duplikat [python otworzyć wbudowaną funkcję: Różnica między trybami A, A +, W, W + i R +] (http://stackoverflow.com/questions/1466000/python-open-built-in-function-difference-between-modes-aaww-and-r) – kay

Odpowiedz

50

r+ służy do czytania i pisania. b jest dla binarnego. Tryb r+b otwiera plik binarny w trybie odczytu lub zapisu.
Możesz przeczytać więcej here.

+0

dlaczego więc działa? – Iamcool

+1

Proszę przeczytać: http://docs.python.org/2/tutorial/inputoutput.html#reading-andwriting-files To by odpowiedzieć na twoje pytanie – karthikr

+0

jeśli udzielę uprawnień do zapisu do pliku obj, gdzie nie jest to wymagane, czy będzie to prowadzić do problemów związanych z bezpieczeństwem w przyszłości? – Iamcool

5

Rozumiem, że dodanie r+ otwiera się zarówno do odczytu, jak i zapisu (podobnie jak wskazano w komentarzu, spowoduje obcięcie pliku). b po prostu otwiera go w trybie binarnym, który powinien być mniej świadomy rzeczy takich jak separatory linii (przynajmniej w C++).

+4

Jeśli się nie mylę, "w +" usunie plik, jeśli istnieje, a następnie otworzy go do odczytu i zapisu. To nie to samo co "r +". –

+0

To dobry punkt, i warto wspomnieć - dzięki! –

12

r otwiera się do czytania, natomiast otwiera się r+ do czytania i pisania. Numer b jest binarny.

ta jest opisana w documentation:

Do najczęściej używanych wartości trybie są 'r' do czytania, 'w' do pisania (obcinanie plik jeśli już istnieje) i 'a' do dopisywania (co w niektórych systemach uniksowych oznacza, że ​​wszystkie zapisy dołączają się do końca pliku niezależnie od aktualnej pozycji szukania). Jeśli tryb zostanie pominięty, domyślnie jest to 'r'. Ustawieniem domyślnym jest użycie trybu tekstowego, który może konwertować znaki '\n' na specyficzne dla platformy odwzorowanie podczas pisania iz powrotem na czytanie. Tak więc, podczas otwierania pliku binarnego, należy dołączyć 'b' do wartości trybu, aby otworzyć plik w trybie binarnym, co poprawi przenośność. (Dołączanie 'b' jest przydatne nawet w systemach, które nie traktują plików binarnych i tekstowych w inny sposób, gdzie służą jako dokumentacja.) Zobacz poniżej, aby zobaczyć więcej możliwych wartości trybu.

Tryby 'r+', 'w+' i 'a+' otwierają plik do aktualizacji (należy pamiętać, że 'w+' obcina plik). Dołącz 'b' do trybu, aby otworzyć plik w trybie binarnym, w systemach, które rozróżniają pliki binarne i tekstowe; w systemach, które nie mają tego rozróżnienia, dodanie wartości 'b' nie daje żadnego efektu.

+0

więc, znaczysz, 'r + b' nie zrobiłoby żadnej różnicy w Linuksie, ale robi na oknach .. co więcej, jaka jest różnica między" rb "i" r + b ".. – Iamcool

+1

Nie jestem pewien czy czytasz tę odpowiedź ostrożnie, @Iamcool. Odpowiada na wszystkie twoje pytania. –

2

W Windows, 'b' przyłączoną do trybu otwiera plik w trybie binarnym, więc tam są również tryby jak 'rb', 'wb' oraz 'R + B'. Python w systemie Windows rozróżnia pliki tekstowe i binarne; Znaki końca linii w plikach tekstowych są automatycznie zmieniane nieznacznie po odczytaniu lub zapisaniu danych.Ta zakulisowa modyfikacja pliku danych jest dobra dla plików tekstowych ASCII, ale spowoduje uszkodzenie danych binarnych, takich jak ten w plikach JPEG lub EXE. Zachowaj ostrożność, aby użyć trybu binarnego podczas czytania i zapisywania takich plików. W systemie Unix nie ma problemu z dodaniem trybu "b" do , więc można go używać niezależnie od platformy dla wszystkich plików binarnych .

Źródło: Reading and Writing Files