Agora eu uso:
pageHeadSectionFile = open('pagehead.section.htm','r')
output = pageHeadSectionFile.read()
pageHeadSectionFile.close()
Mas, para tornar o código melhor, eu posso fazer:
output = open('pagehead.section.htm','r').read()
Ao usar a sintaxe acima, como fecho o arquivo para liberar recursos do sistema?
contents = os.readfile(path)
. Se eu quisesse fazer algo mais sofisticado, ok, eu usaria felizwith open(path) as fd: contents = fd.read()
. É claro que se pode escrever seu próprio wrapper, mas é para isso que serve o núcleo, para fornecer as abstrações úteis aos programadores.Respostas:
Você realmente não precisa fechá-lo - o Python o fará automaticamente durante a coleta de lixo ou na saída do programa. Mas, como observou @delnan, é uma prática recomendada fechá-lo explicitamente por vários motivos.
Então, o que você pode fazer para mantê-lo breve, simples e explícito:
Agora são apenas duas linhas e bem legíveis, eu acho.
fonte
with
instrução, o recurso de arquivo será fechado corretamente para você.output = f.read()
peça na mesma linha após a:
.O módulo Pathlib da Biblioteca Padrão do Python faz o que você procura:
Não se esqueça de importar o Path:
No Python 27, instale o backport
pathlib
oupathlib2
fonte
with
são boas, maswith
são uma afirmação, não uma expressão. Estapathlib
resposta é a única resposta à pergunta original que pode ser incorporada em uma expressão Python. Algo comoSECRET_KEY = os.environ.get('SECRET_KEY') or pathlib.Path('SECRET_KEY').read_bytes()
Usando o CPython, seu arquivo será fechado imediatamente após a execução da linha, porque o objeto do arquivo é imediatamente coletado como lixo. Existem duas desvantagens:
Nas implementações Python diferentes do CPython, o arquivo geralmente não é fechado imediatamente, mas posteriormente, além do seu controle.
No Python 3.2 ou superior, isso gerará um
ResourceWarning
, se ativado.Melhor investir uma linha adicional:
Isso garantirá que o arquivo seja fechado corretamente em todas as circunstâncias.
fonte
Não há necessidade de importar nenhuma biblioteca especial para fazer isso.
Use a sintaxe normal e ele abrirá o arquivo para leitura e depois o fechará.
ou
que fornece uma matriz x contendo as linhas e pode ser impressa da seguinte forma:
Essas one-liners são muito úteis para manutenção - basicamente auto-documentadas.
fonte
O que você pode fazer é usar a
with
instrução e escreva as duas etapas em uma linha:A
with
instrução cuidará de chamar a__exit__
função do objeto fornecido, mesmo que algo de ruim tenha acontecido no seu código; está perto datry... finally
sintaxe. Para o objeto retornado poropen
,__exit__
corresponde ao fechamento do arquivo.Esta declaração foi introduzida no Python 2.6.
fonte
with
foi introduzida no Python 2.5, mas teve que ser explicitamente importada do__future__
. Tornou-se disponível em todos os contextos no Python 2.6.use ilio : (inline io):
apenas uma chamada de função em vez de abrir o arquivo (), ler (), fechar ().
fonte
fonte
python -c
na linha de comando, portanto, publicar respostas em duas linhas não ajuda."
, use;
para acrescentar duas instruções e excluir nova linha depois:
? A seguinte expressão funciona muito bem para mim: #$> python -c "with open('some file', 'r') as f: print(next(f))"
Eu acho que a maneira mais natural de conseguir isso é definir uma função.
Então você pode fazer o seguinte:
fonte
Freqüentemente faço algo assim quando preciso obter algumas linhas em torno de algo que recebi em um arquivo de log:
fonte
grep -A <n>
,grep -B <n>
egrep -C <n>
, se ele é útil. Mais informações: stackoverflow.com/a/9083/1830159Usando
more_itertools.with_iter
, é possível abrir, ler, fechar e atribuir um equivalenteoutput
em uma linha (excluindo a declaração de importação):Embora possível, eu procuraria outra abordagem além de atribuir o conteúdo de um arquivo a uma variável, ou seja, iteração lenta - isso pode ser feito usando um
with
bloco tradicional ou no exemplo acima, removendojoin()
e iterandooutput
.fonte
"".join(line for line in __import__('more_itertools').with_iter(open("pagehead.section.htm", "r")))
Isso funciona muito bem e elimina a necessidade de uma linha para a importação.Se você quer aquele sentimento quente e confuso, vá em frente .
Para o python 3.6, executei esses dois programas sob um novo começo do IDLE, fornecendo tempos de execução de:
Portanto, não há muita diferença.
RESULTADO:
RESULTADO:
fonte