Вопрос

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

Кто -нибудь знает, какая сделка с гнездованием с заявлениями в 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 игнорировать его.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top