Confused by python file mode " w+"

Z doc ,

Tryby 'r+', 'w+' I 'A+' otwierają plik do aktualizacji (zauważ, że' w+ ' obcina plik). Dołączenie' b 'do trybu, aby otworzyć plik w trybie binarnym, na systemach, które rozróżniają pliki binarne i tekstowe; na systemach, które nie mają tego rozróżnienia, dodanie 'b' nie ma wpływu.

I tutaj

W+: otwiera plik do zapisu i odczytu. Nadpisuje istniejący plik, jeśli plik istnieje. Jeśli plik nie istnieje, tworzy nowy plik do odczytu i zapisu.

Ale jak odczytać plik otwarty za pomocą w+?

 126
Author: holys, 2013-04-25

6 answers

Załóżmy, że otwierasz plik za pomocą with instrukcji, tak jak powinieneś. Wtedy zrobiłbyś coś takiego, aby przeczytać 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'

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

 77
Author: rmunn,
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-08-27 21:52:31

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

  • R

    Otwiera plik Tylko do odczytu. Wskaźnik pliku jest umieszczony na początku pliku. Jest to tryb domyślny.

  • Rb

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

  • R +

    Otwiera plik zarówno do czytania, jak i pisania. Wskaźnik pliku będzie znajdował się na początku pliku.

  • Rb+

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

  • W

    Otwiera plik Tylko do zapisu. Nadpisuje plik, jeśli plik istnieje. Jeśli plik nie istnieje, tworzy nowy plik do zapisu.

  • Wb

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

  • W +

    Otwiera plik do zapisu i odczytu. Nadpisuje 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. Nadpisuje istniejący plik, jeśli plik istnieje. Jeśli plik nie istnieje, tworzy nowy plik do odczytu i zapisu.

  • A

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

  • Ab

    Otwiera plik do dodania w formacie binarnym. Wskaźnik pliku znajduje się na koniec pliku, jeśli plik istnieje. Oznacza to, że plik jest w trybie dopisywania. Jeśli plik nie istnieje, tworzy nowy plik do zapisu.

  • A +

    Otwiera plik do dodania i odczytu. Wskaźnik pliku znajduje się na końcu pliku, jeśli plik istnieje. Plik zostanie otwarty w trybie dopisywania. Jeśli plik nie istnieje, tworzy nowy plik do odczytu i zapisu.

  • Ab+

    Otwiera plik dla obu dodawanie i odczyt w formacie binarnym. Wskaźnik pliku znajduje się na końcu pliku, jeśli plik istnieje. Plik zostanie otwarty w trybie dopisywania. Jeśli plik nie istnieje, tworzy nowy plik do odczytu i zapisu.

 274
Author: Nullify,
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
2014-05-09 14:19:17

Wszystkie tryby plików w Pythonie

  • r do czytania
  • r+ otwiera się do odczytu i zapisu (nie można obciąć pliku)
  • w do pisania
  • w+ do zapisu i odczytu (można obciąć plik)
  • rb do odczytu pliku binarnego. Wskaźnik pliku jest umieszczony na początku pliku.
  • rb+ odczyt lub zapis pliku binarnego
  • wb+ zapis pliku binarnego
  • a+ otwiera dla dodawanie
  • ab+ otwiera plik do dodania i odczytu w formacie binarnym. Wskaźnik pliku znajduje się na końcu pliku, jeśli plik istnieje. Plik zostanie otwarty w trybie dopisywania.
  • x Otwórz do tworzenia wyłącznie, jeśli plik już istnieje (Python 3)
 117
Author: Alok Agarwal,
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-11-10 23:10:33

Plik jest obcinany, więc możesz wywołać read() (nie ma wyjątków, w przeciwieństwie do otwarcia za pomocą 'w'), ale otrzymasz pusty łańcuch.

 2
Author: Elazar,
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
2013-04-25 06:57:23

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

1) co jest oczywiste, jest otworzyć plik Tylko do odczytu, odczytać go do pamięci, a następnie otworzyć plik z t, a następnie zapisać zmiany.

2) Użyj procedur obsługi plików niskiego poziomu:

# 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..
 1
Author: Dory Zidon,
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
2013-04-25 07:02:48

Właściwie, jest coś nie tak z innymi odpowiedziami na temat r+ mode.

test.in zawartość pliku:

hello1
ok2
byebye3

I skrypt py:

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

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

hello1
ok2
byebye3
addition

Jednak gdy zmienimy skrypt na:

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

test.in wykonaj również odpowiedź:

additionk2
byebye3

Tak więc tryb r+ pozwoli nam zakryć zawartość Od początku, jeśli nie wykonamy operacji odczytu. A jeśli zrobimy coś operacja odczytu, f.write() po prostu dopisze do pliku.

Przy okazji, jeśli f.seek(0,0) przed f.write(write_content), write_content pokryje je z pozycji (0,0).

 0
Author: Find,
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
2016-07-29 01:42:05