В гнездование «с» заявлениями в Python
-
22-09-2019 - |
Вопрос
Оказывается, что «с» - это забавное слово для поиска в Интернете.
Кто -нибудь знает, какая сделка с гнездованием с заявлениями в Python?
Я отслеживал очень скользкую ошибку в сценарии, который писал, и я подозреваю, что это потому, что я делаю это:
with open(file1) as fsock1:
with open(file2, 'a') as fsock2:
fstring1 = fsock1.read()
fstring2 = fsock2.read()
Python бросается, когда я пытаюсь read()
от fsock2. После проверки в отладчике это потому, что он думает, что файл пуст. Это не будет тревожным, за исключением того факта, что запуск тот же код в отладке не with
Заявление показывает мне, что файл, на самом деле, весьма полон текста ...
Я собираюсь приступить к предположению, что сейчас гнездо with
Заявления-нет-нет, но если у кого-то, кто знает больше, есть другое мнение, я бы хотел услышать это.
Решение
Я нашел решение в документе Python. Вы можете взглянуть на это (Python 3) или же это (Python 2)
Если вы используете Python 2.7+, вы можете использовать его так:
with open(file1) as fsock1, open(file2, 'a') as fsock2:
fstring1 = fsock1.read()
fstring2 = fsock2.read()
Таким образом, вы избегаете ненужного отступления.
Другие советы
Afaik вы не можете прочитать файл, открытый с режимом добавления 'a'
.
После проверки в отладчике это потому, что он думает, что файл пуст.
Я думаю, что это происходит потому, что это не может ничего читать. Даже если это может, когда вы добавляете в файл, указатель Seek перемещается в конце файла в подготовке к написанию.
Эти with
Заявления работают для меня отлично:
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, и вам придется оставить его до коллекционера мусора. Это потенциально очень плохая вещь.
Нет проблем с гнездованием with
Заявления - скорее, вы открываете file2
Для добавления, так что вы не можете читать из этого.
Если вы не любите гнездовать with
Заявления, по какой -то причине, вы часто можете избежать этого с помощью Contextlib.nested функция Тем не менее, он не заставит сломанный код (например, код, который открывает файл для добавления, а затем пытается прочитать его). with
Заявления нарушают код, который в противном случае хорошо.
Что касается поиска «с», префикс слова с '+' не позволит Google игнорировать его.