Czy istnieje sposób otwarcia pliku do odczytu i zapisu?
Aby obejść ten problem, otwieram plik do pisania, zamykam go, a następnie otwieram ponownie do odczytu. Ale czy jest jakiś sposób, aby otworzyć plik dla obu czytania i pisania?
jaki problem rozwiązujesz? może istnieje lepsze rozwiązanie niż zapisywanie / czytanie pliku, np.mmap
Roman Bodnarchuk
1
Czy możesz podać nam swój kod, abyśmy mogli Ci odpowiedzieć. Możesz także spróbować: docs.python.org/tutorial/… . Jednak próbowałem użyć r + b i działa. Czy jest też korzyść z używania jednego deskryptora pliku w funkcjach diff?
Artsiom Rudzenka
@RomanBodnarchuk mmapto świetny pomysł, ale co, jeśli masz do czynienia z współbieżnością? Czy istnieje sposób na zarezerwowanie dostępu?
Dr_Zaszuś
Odpowiedzi:
267
Oto w jaki sposób czytasz plik, a następnie zapisujesz go (zastępując istniejące dane), bez zamykania i ponownego otwierania:
with open(filename,"r+")as f:
data = f.read()
f.seek(0)
f.write(output)
f.truncate()
użyj, a+aby zakryć przypadek końcowy, że plik nie istnieje (zostanie utworzony)
Jossef Harush
16
seek () i truncate () są krytyczne!
smwikipedia
4
@JossefHarush Zauważ, że dokumentacja astanów „w niektórych systemach uniksowych oznacza, że wszystkie zapisy dołączają się na końcu pliku, niezależnie od bieżącej pozycji wyszukiwania”. W takim przypadku f.seek(0)nie będzie działać zgodnie z oczekiwaniami. Właśnie podupadłem na Linuksie.
Graeme
6
Lepiej wyjaśnij, dlaczego seeki truncatejest tutaj używany. Większość czytelników pochodzi z Google i kopiuje i wkleja.
Shiplu Mokaddim
8
Po przeczytaniu pliku wskaźnik pliku (fp) przesunął się do przodu, dlatego należy ustawić go na początku. To seek(0)robi: ustawia fp na pozycję 0( tj . Początek). truncate()obetnij plik do podanej liczby bajtów, tzn. usuwa całą zawartość pliku po określonej liczbie bajtów. Wyobraź sobie, że twój plik ma ciąg Hello, worldi piszesz Bye. Jeśli nie, truncate()zawartość na końcu będzie Byelo, world, ponieważ nigdy nie usunąłeś tekstu, który istniał w pliku. truncate()obcina plik do bieżącego fp.
Illya Gerasymchuk
48
r+jest kanonicznym trybem do jednoczesnego czytania i pisania. Nie różni się to od używania fopen()wywołania systemowego, ponieważ file()/ open()jest tylko niewielkim opakowaniem wokół tego wywołania systemu operacyjnego.
|Mode| r | r+| w | w+| a | a+||:--------------------:|:--:|:--:|:--:|:--:|:--:|:--:||Read|+|+||+||+||Write||+|+|+|+|+||Create|||+|+|+|+||Cover|||+|+||||Pointin the beginning |+|+|+|+||||Pointin the end |||||+|+|
Również czytanie, a następnie pisanie działa równie dobrze w trybie „r + b”, ale musisz użyć f.seek (0) między f.read () i f.write (), aby umieścić kursor z powrotem na początku pliku.
gaborous
2
Pamiętaj, że jeśli dane, które zapisujesz, nie są już tymi, które już tam są, nie zostaną obcięte. Użyj tej truncatemetody, aby to zatrzymać.
mmap
mmap
to świetny pomysł, ale co, jeśli masz do czynienia z współbieżnością? Czy istnieje sposób na zarezerwowanie dostępu?Odpowiedzi:
Oto w jaki sposób czytasz plik, a następnie zapisujesz go (zastępując istniejące dane), bez zamykania i ponownego otwierania:
źródło
a+
aby zakryć przypadek końcowy, że plik nie istnieje (zostanie utworzony)a
stanów „w niektórych systemach uniksowych oznacza, że wszystkie zapisy dołączają się na końcu pliku, niezależnie od bieżącej pozycji wyszukiwania”. W takim przypadkuf.seek(0)
nie będzie działać zgodnie z oczekiwaniami. Właśnie podupadłem na Linuksie.seek
itruncate
jest tutaj używany. Większość czytelników pochodzi z Google i kopiuje i wkleja.seek(0)
robi: ustawia fp na pozycję0
( tj . Początek).truncate()
obetnij plik do podanej liczby bajtów, tzn. usuwa całą zawartość pliku po określonej liczbie bajtów. Wyobraź sobie, że twój plik ma ciągHello, world
i piszeszBye
. Jeśli nie,truncate()
zawartość na końcu będzieByelo, world
, ponieważ nigdy nie usunąłeś tekstu, który istniał w pliku.truncate()
obcina plik do bieżącego fp.r+
jest kanonicznym trybem do jednoczesnego czytania i pisania. Nie różni się to od używaniafopen()
wywołania systemowego, ponieważfile()
/open()
jest tylko niewielkim opakowaniem wokół tego wywołania systemu operacyjnego.źródło
Podsumuj zachowania we / wy
i gałąź decyzyjna
źródło
Próbowałem czegoś takiego i działa zgodnie z oczekiwaniami:
Gdzie:
I:
Również jeśli otworzysz samouczek Pythona na temat odczytu i zapisu plików , zauważysz, że:
źródło
truncate
metody, aby to zatrzymać.