Pergunta

Acontece que "com" é uma palavra engraçada para procurar na internet.

Alguém sabe qual é o acordo com as declarações em Python?
Eu tenho acompanhado um bug muito escorregadio em um script que tenho escrito e suspeito que seja porque estou fazendo isso:

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

Python lança quando tento read() de fsock2. Após a inspeção no depurador, isso ocorre porque acha que o arquivo está vazio. Isso não seria preocupante, exceto pelo fato de que executar exatamente o mesmo código no interperter de depuração não em um with A declaração me mostra que o arquivo é, de fato, bastante cheio de texto ...

Vou prosseguir com a suposição de que, por enquanto, nidificar with As declarações não são não, mas se alguém que sabe mais tem uma opinião diferente, eu adoraria ouvi-la.

Foi útil?

Solução

Encontrei a solução no documento de Python. Você pode querer dar uma olhada Este (Python 3) ou Este (Python 2)

Se você estiver executando o Python 2.7+, pode usá -lo assim:

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

Dessa forma, você evita o recuo desnecessário.

Outras dicas

AFAIK Você não pode ler um arquivo aberto com o modo Append 'a'.

Após a inspeção no depurador, isso ocorre porque acha que o arquivo está vazio.

Eu acho que isso acontece porque não pode realmente ler nada. Mesmo que pudesse, quando você anexar um arquivo, o ponteiro de busca é movido para o final do arquivo, na preparação para a escrita.

Esses with As declarações funcionam muito bem para mim:

with open(file1) as f:
    with open(file2, 'r') as g:   # Read, not append.
        fstring1 = f.read()
        fstring2 = g.read()

Observe que o uso de contextlib.nested, como outro pôster sugeriu, está potencialmente repleto de perigo aqui. Digamos que você faça isso:

with contextlib.nested(open(file1, "wt"), open(file2)) as (f_out, f_in):
   ...

Os gerentes de contexto aqui são criados um de cada vez. Isso significa que, se a abertura do File2 falhar (digamos, porque não existir), você não poderá finalizar corretamente o File1 e você terá que deixá -lo para o coletor de lixo. Isso é potencialmente uma coisa muito ruim.

Não há problema com o ninho with declarações - em vez disso, você está abrindo file2 Para anexar, para que você não possa ler.

Se você não gosta de nidificar with declarações, por qualquer motivo, muitas vezes você pode evitar isso com o contextlib.nested função. No entanto, ele não fará o código quebrado (por exemplo, código que abre um arquivo para anexar e depois tenta lê -lo) funcionar, nem nidificar lexicamente with Declarações quebram o código que é bom.

Quanto à busca por "com", a prefixação de uma palavra com '+' impedirá que o Google a ignore.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top