2010-01-02 4 views
4

Получается, что «с» - это забавное слово для поиска в Интернете.Вложения «WITH» в Python

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

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

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

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

ответ

4

Я нашел решение в документе python. Вы можете посмотреть на this

Если вы работаете питона 3.1+ вы можете использовать его как это:

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

Таким образом, можно избежать ненужного отступа.

6

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

+0

Я как раз собирался прокомментировать мой собственный вопрос, осознав то же самое. Я чувствую ... сейчас глупо. – Geoff

1

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

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

3

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

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

Этих 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): 
    ... 

Менеджеры контекста здесь создаются по одному. Это означает, что если открытие файла2 завершится неудачно (скажем, потому что оно не существует), то вы не сможете правильно финализировать файл1, и вам придется оставить его в сборщике мусора. Это потенциально очень плохое.

0

Что касается поиска «с», то префикс слова «+» предотвратит игнорирование Google.

+0

полезно! Спасибо. – Geoff

+1

Это было правдой. Теперь вам нужно окружить его кавычками, то есть '' с помощью ''. –

Смежные вопросы