Zdezorientowany przez tryb pliku python „w +”

201

Z dokumentu ,

Tryby „r +”, „w +” i „a +” otwierają plik do aktualizacji (zwróć uwagę, że „w +” obcina plik). Dołącz „b” do trybu, aby otworzyć plik w trybie binarnym, w systemach rozróżniających pliki binarne i tekstowe; w systemach, które nie mają tego rozróżnienia, dodanie „b” nie ma wpływu.

i tutaj

w +: Otwiera plik do pisania i czytania. Zastępuje istniejący plik, jeśli plik istnieje. Jeśli plik nie istnieje, tworzy nowy plik do odczytu i zapisu.

Ale jak odczytać otwarty plik w+?

holys
źródło
27
Uważam ten schemat za bardzo przydatny.
Ritwik

Odpowiedzi:

132

Powiedzmy, że otwierasz plik withstwierdzeniem takim, jakim powinieneś być. Następnie możesz zrobić coś takiego, aby odczytać ze swojego pliku:

with open('somefile.txt', 'w+') as f:
    # Note that f has now been truncated to 0 bytes, so you'll only
    # be able to read data that you write after this point
    f.write('somedata\n')
    f.seek(0)  # Important: return to the top of the file before reading, otherwise you'll just read an empty string
    data = f.read() # Returns 'somedata\n'

Uwaga f.seek(0)- jeśli zapomnisz o tym, f.read()wywołanie spróbuje odczytać z końca pliku i zwróci pusty ciąg.

rmunn
źródło
1
co oznacza „obcięcie do 0 bajtów”?
Nasif Imtiaz Ohi
22
@NasifImtiazOhi - Dokumenty Pythona mówią, że w+„ nadpiszą istniejący plik, jeśli plik istnieje”. Więc jak tylko otworzysz plik w+, jest on teraz pustym plikiem: zawiera 0 bajtów. Jeśli kiedyś zawierał dane, zostały one obcięte - odcięte i wyrzucone - a teraz rozmiar pliku wynosi 0 bajtów, więc nie można odczytać żadnych danych, które istniały przed otwarciem pliku w+. Jeśli naprawdę chcesz przeczytać poprzednie dane i dodać je, powinieneś użyć r+zamiast w+.
rmunn
jak dodać nowe dane na górze?
Beqa Bukhradze,
1
@BeqaBukhradze - Jeśli masz pytanie, kliknij przycisk „Zadaj pytanie”, gdzie zobaczy je setki osób. Nie wystarczy kliknąć przycisk „Dodaj komentarz”, w którym zobaczy go tylko jedna lub dwie osoby.
rmunn
430

Oto lista różnych trybów otwierania pliku:

  • r

    Otwiera plik tylko do odczytu. Wskaźnik pliku zostanie umieszczony na początku pliku. To jest tryb domyślny.

  • rb

    Otwiera plik do odczytu tylko w formacie binarnym. Wskaźnik pliku zostanie umieszczony na początku pliku. To jest tryb domyślny.

  • r +

    Otwiera plik do odczytu i zapisu. Wskaźnik pliku będzie na początku pliku.

  • rb +

    Otwiera plik do odczytu i zapisu w formacie binarnym. Wskaźnik pliku będzie na początku pliku.

  • w

    Otwiera plik tylko do zapisu. Zastępuje plik, jeśli plik istnieje. Jeśli plik nie istnieje, tworzy nowy plik do zapisu.

  • wb

    Otwiera plik do zapisu tylko w formacie binarnym. Zastępuje plik, jeśli plik istnieje. Jeśli plik nie istnieje, tworzy nowy plik do zapisu.

  • w +

    Otwiera plik do pisania i czytania. Zastępuje istniejący plik, jeśli plik istnieje. Jeśli plik nie istnieje, tworzy nowy plik do odczytu i zapisu.

  • wb +

    Otwiera plik do zapisu i odczytu w formacie binarnym. Zastępuje istniejący plik, jeśli plik istnieje. Jeśli plik nie istnieje, tworzy nowy plik do odczytu i zapisu.

  • za

    Otwiera plik do dołączenia. Wskaźnik pliku znajduje się na końcu pliku, jeśli plik istnieje. Oznacza to, że plik jest w trybie dołączania. Jeśli plik nie istnieje, tworzy nowy plik do zapisu.

  • ab

    Otwiera plik do dołączenia w formacie binarnym. Wskaźnik pliku znajduje się na końcu pliku, jeśli plik istnieje. Oznacza to, że plik jest w trybie dołączania. Jeśli plik nie istnieje, tworzy nowy plik do zapisu.

  • a +

    Otwiera plik do dołączania i czytania. Wskaźnik pliku znajduje się na końcu pliku, jeśli plik istnieje. Plik otwiera się w trybie dołączania. Jeśli plik nie istnieje, tworzy nowy plik do odczytu i zapisu.

  • ab +

    Otwiera plik do dołączenia i odczytu w formacie binarnym. Wskaźnik pliku znajduje się na końcu pliku, jeśli plik istnieje. Plik otwiera się w trybie dołączania. Jeśli plik nie istnieje, tworzy nowy plik do odczytu i zapisu.

Unieważnić
źródło
więc dla wszystkich intensywnych celów r + i w + są takie same?
Nick Humrich
21
@ Huminger: Nie, w+tworzy nowy plik lub obcina istniejący plik, a następnie otwiera go do odczytu i zapisu; r+otwiera istniejący plik bez obcięcia go do odczytu i zapisu. Bardzo różne.
abarnert
Podobnie, jak w przypadku odpowiedzi @ AlokAgarwal, twierdzi, że jest to wyczerpująca lista trybów, ale nie jest.
abarnert
1
Całkiem głupio byłoby podać wyczerpującą listę trybów, ponieważ działają one bardziej jak funkcja z wieloma parametrami. r, wlub asą wyłączne, ale bmożna je dodać do dowolnego z nich, tak jak +lub U... To wybuch kombinatoryczny.
rmunn
4
rbnie jest trybem domyślnym, cytat: The most commonly-used values of mode are 'r' for reading, 'w' for writing (truncating the file if it already exists), and 'a' for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position). If mode is omitted, it defaults to 'r' docs.python.org/2/library/functions.html#open
iggy
158

Wszystkie tryby plików w Pythonie

  • r do czytania
  • r+ otwiera się do odczytu i zapisu (nie może obciąć pliku)
  • w do pisania
  • w+ do pisania i czytania (może obciąć plik)
  • rbdo odczytu pliku binarnego. Wskaźnik pliku zostanie umieszczony na początku pliku.
  • rb+ odczyt lub zapis pliku binarnego
  • wb+ zapisywanie pliku binarnego
  • a+ otwiera się na dołączenie
  • ab+Otwiera plik do dołączania i odczytu w formacie binarnym. Wskaźnik pliku znajduje się na końcu pliku, jeśli plik istnieje. Plik otwiera się w trybie dołączania.
  • x otwarte do wyłącznego tworzenia, awaria, jeśli plik już istnieje (Python 3)
Alok Agarwal
źródło
5
To nie wszystkie tryby. Pomija np. rbI wb, nie wspominając o Utrybach w 2.x i ttrybie w 3.x (które można łączyć ze wszystkim oprócz b).
abarnert
1
Różnica między r + i w + polega na tym, że w + obcina plik podczas jego otwierania. Ale możesz obciąć go ręcznie w obu trybach.
Martin
1
Ta odpowiedź jest niezgodna z odpowiedzią udzieloną przez @ 200 OK, na przykład czy wb+też czyta z pliku?
Celeritas,
@Celeritas Wb wskazuje, że plik jest otwarty do zapisu w trybie binarnym. W systemach Unix (Linux, Mac OS X itp.) Tryb binarny nic nie robi - traktuje pliki tekstowe w taki sam sposób, jak inne pliki. Jednak w systemie Windows pliki tekstowe są zapisywane z nieznacznie zmodyfikowanymi zakończeniami linii. Powoduje to poważny problem w przypadku rzeczywistych plików binarnych, takich jak pliki exe lub jpg. Dlatego podczas otwierania plików, które nie powinny być tekstem, nawet w Uniksie, powinieneś użyć wb lub rb. Używaj zwykłego w lub r tylko dla plików tekstowych.
Alok Agarwal,
W Pythonie 3 dostępny jest również tryb otwarty „x”: otwarty na wyłączne tworzenie, awaria, jeśli plik już istnieje. Zobacz funkcję otwartą w dokumencie.
Laurent LAPORTE,
9

r do przeczytania

w do pisania

r+ do odczytu / zapisu bez usuwania oryginalnej treści, jeśli plik istnieje, w przeciwnym razie zgłoszenie wyjątku

w+ w celu usunięcia oryginalnej treści, a następnie odczyt / zapis, jeśli plik istnieje, w przeciwnym razie utwórz plik

Na przykład,

>>> with open("file1.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file1.txt", "w+") as f:
...   f.write("c")
... 

$ cat file1.txt 
c$
>>> with open("file2.txt", "r+") as f:
...   f.write("ab\n")
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'file2.txt'
>>> with open("file2.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file2.txt", "r+") as f:
...   f.write("c")
... 

$ cat file2.txt 
cb
$
GraceMeng
źródło
2

Plik jest obcinany, więc można zadzwonić read()(bez wyjątków podniesiony, w odróżnieniu od kiedy otwarto używając „w”), ale dostaniesz pusty ciąg.

Elazar
źródło
2

Podejrzewam, że istnieją dwa sposoby radzenia sobie z tym, co myślę, że próbujesz osiągnąć.

1) co jest oczywiste, należy otworzyć plik tylko do odczytu, wczytać go do pamięci, a następnie otworzyć plik za pomocą t, a następnie zapisać zmiany.

2) użyj niskopoziomowych procedur obsługi plików:

# Open file in RW , create if it doesn't exist. *Don't* pass O_TRUNC
 fd = os.open(filename, os.O_RDWR | os.O_CREAT)

Mam nadzieję że to pomoże..

Dory Zidon
źródło
To po co r+
SmartManoj
1

W rzeczywistości jest coś złego we wszystkich innych odpowiedziach dotyczących r+trybu.

test.in zawartość pliku :

hello1
ok2
byebye3

A skrypt py:

with open("test.in", 'r+')as f:
    f.readline()
    f.write("addition")

Wykonaj go, a test.inzawartość zostanie zmieniona na:

hello1
ok2
byebye3
addition

Jednak gdy zmodyfikujemy skrypt, aby:

with open("test.in", 'r+')as f:
    f.write("addition")

test.inrównież wykonać Odpowiedz:

additionk2
byebye3

Tak więc r+tryb pozwoli nam zakryć zawartość od samego początku, jeśli nie wykonamy operacji odczytu. A jeśli wykonamy operację odczytu, f.write()po prostu dołączą się do pliku.

Nawiasem mówiąc, jeśli f.seek(0,0)wcześniej f.write(write_content), write_content obejmie je z pozycji (0,0).

Odnaleźć
źródło
0

Jak wspomniano w h4z3 , Do praktycznego użytku, czasami twoje dane są zbyt duże, aby bezpośrednio załadować wszystko, lub masz generator lub dane przychodzące w czasie rzeczywistym, możesz użyć w +, aby zapisać w pliku i przeczytać później.

SmartManoj
źródło