Этот простой кодИсключение в «с» блок заготовок файл открыт для записи
# This code will BLANK the file 'myfile'!
with open('myfile', 'w') as file:
raise Exception()
, а не просто бросать исключение, удаляет все данные в «MYFILE», хотя никакой фактической операции записи не даже попытки.
Это, по меньшей мере, опасно, и, конечно, не то, как другие языки относятся к таким ситуациям.
Как я могу предотвратить это? Должен ли я обрабатывать все возможные исключения, чтобы быть уверенным, что целевой файл не будет заглушен каким-либо непредвиденным условием? Разумеется, для решения этой проблемы должен быть стандартный шаблон. И, прежде всего: что здесь происходит в первую очередь?
Это потому, что режим «w» или «запись» по умолчанию будет сначала обрезать файл. Это делается в то время, когда происходит «open (..)». – SuperSaiyan
Вы ошибаетесь, каждый язык, который я знаю, будет обрезать файл по умолчанию, когда вы откроете его для записи, независимо от того, сколько (если оно есть) вы затем напишите на него. –
Это поведение не имеет ничего общего с Python. Это определенная семантика системного вызова 'open' под POSIX/Unix/Linux, OS X и Windows. Если вы хотите изменить это поведение на Python, вам нужно опуститься до уровня ОС с помощью [os.open] (http://linux.die.net/man/2/open), в частности, опустив константу «O_TRUNC» из *Режим*. – msw