Оказывается, что "с" забавное слово для поиска в Интернете.
Кто-либо знает то, что соглашение с вложением с операторами в Python?
Я разыскивал очень скользкую ошибку в сценарии, который я писал, и я подозреваю, что это - потому что я делаю это:
with open(file1) as fsock1:
with open(file2, 'a') as fsock2:
fstring1 = fsock1.read()
fstring2 = fsock2.read()
Python подбрасывает, когда я пытаюсь read()
от fsock2. После контроля в отладчике это вызвано тем, что он думает, что файл пуст. Это не было бы беспокоящим за исключением того, что, выполнив тот же самый код в отладке, межболее дерзкой не в a with
оператор показывает мне, что файл, на самом деле, довольно полон текста...
Я собираюсь продолжить двигаться при условии, что на данный момент вложение with
операторы нет - нет, но если у кого-либо, кто знает больше, есть другое мнение, я хотел бы услышать его.
AFAIK нельзя прочитать файл, открытый в режиме добавления 'a'
.
После проверки в отладчике это происходит потому, что он думает, что файл пуст.
Я думаю, что это происходит потому, что он на самом деле ничего не может прочитать. Даже если бы он мог, при добавлении в файл, указатель поиска перемещается в конец файла при подготовке к записи.
Эти с
утверждения работают для меня просто отлично:
with open(file1) as f:
with open(file2, 'r') as g: # Read, not append.
fstring1 = f.read()
fstring2 = g.read()
Обратите внимание, что использование contextlib.nested
, как и предполагалось в другом предложенном плакате, здесь потенциально чревато опасностями. Скажем так:
with contextlib.nested(open(file1, "wt"), open(file2)) as (f_out, f_in):
...
контекстные менеджеры здесь создаются по одному. Это означает, что если открыть file2 не удастся (скажем, потому что его не существует), то вы не сможете корректно завершить работу над file1 и вам придется оставить его на усмотрение сборщика мусора. Это потенциально очень плохая вещь.
Что касается поиска "с", то префикс слова со словом "+" не позволит гуглу его проигнорировать.
Нет проблем со вложением с операторами
-- скорее, Вы открываете file2
для добавления, так что Вы не можете прочитать из него.
Если Вам по каким-либо причинам не нравится вложение с операторами
, Вы можете часто избежать этого с помощью функции contextlib.nested. Однако, это не заставит работать ломаный код (например, код, который открывает файл для добавления, а затем пытается его прочитать вместо него), равно как и лексически вложенный код с операторами
, который в противном случае хорошо работает.