Вложенные операторы 'WITH' в Python

Оказывается, что "с" забавное слово для поиска в Интернете.

Кто-либо знает то, что соглашение с вложением с операторами в Python?
Я разыскивал очень скользкую ошибку в сценарии, который я писал, и я подозреваю, что это - потому что я делаю это:

with open(file1) as fsock1:
    with open(file2, 'a') as fsock2:
        fstring1 = fsock1.read()
        fstring2 = fsock2.read()

Python подбрасывает, когда я пытаюсь read() от fsock2. После контроля в отладчике это вызвано тем, что он думает, что файл пуст. Это не было бы беспокоящим за исключением того, что, выполнив тот же самый код в отладке, межболее дерзкой не в a with оператор показывает мне, что файл, на самом деле, довольно полон текста...

Я собираюсь продолжить двигаться при условии, что на данный момент вложение with операторы нет - нет, но если у кого-либо, кто знает больше, есть другое мнение, я хотел бы услышать его.

10
задан user184411 17 September 2016 в 05:45
поделиться

4 ответа

AFAIK нельзя прочитать файл, открытый в режиме добавления 'a'.

.
7
ответ дан 3 December 2019 в 14:34
поделиться

После проверки в отладчике это происходит потому, что он думает, что файл пуст.

Я думаю, что это происходит потому, что он на самом деле ничего не может прочитать. Даже если бы он мог, при добавлении в файл, указатель поиска перемещается в конец файла при подготовке к записи.

Эти с утверждения работают для меня просто отлично:

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 и вам придется оставить его на усмотрение сборщика мусора. Это потенциально очень плохая вещь.

7
ответ дан 3 December 2019 в 14:34
поделиться

Что касается поиска "с", то префикс слова со словом "+" не позволит гуглу его проигнорировать.

0
ответ дан 3 December 2019 в 14:34
поделиться

Нет проблем со вложением с операторами -- скорее, Вы открываете file2 для добавления, так что Вы не можете прочитать из него.

Если Вам по каким-либо причинам не нравится вложение с операторами , Вы можете часто избежать этого с помощью функции contextlib.nested. Однако, это не заставит работать ломаный код (например, код, который открывает файл для добавления, а затем пытается его прочитать вместо него), равно как и лексически вложенный код с операторами , который в противном случае хорошо работает.

.
1
ответ дан 3 December 2019 в 14:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: