Pergunta sobre python – No Python, como posso abrir um arquivo e lê-lo em uma linha e ainda conseguir fechar o arquivo depois?

5

Enquanto trabalhava com este exercício, me deparei com um problema.

from sys import argv
from os.path import exists

script, from_file, to_file = argv
print "Copying from %s to %s" % (from_file, to_file)

# we could do these two on one line too, how?
input = open(from_file)
indata = input.read()

print "The input file is %d bytes long" % len(indata)
print "Does the output file exist? %r" % exists(to_file)
print "Ready, hit RETURN to continue, CTRL-C to abort."

raw_input()

output = open(to_file, 'w')
output.write(indata)
print "Alright, all done."
output.close()
input.close()

A linha# we could do these two on one line too, how? é o que está me confundindo. A única resposta que consegui encontrar foi:

indata = open(from_file).read()

Isso funcionou do jeito que eu queria, mas requer que eu remova:

input.close()

como a variável de entrada não existe mais. Como então, posso realizar essa operação próxima?

Como você resolveria isso?

Obrigado a todos. Eu me sinto melhor agora. @Paul D. Waite Obrigado por editar minha pergunta. Está muito mais claro agora. yoonsi
seja bem-vindo! Geralmente, é mais fácil para outra pessoa ver qual é o ponto crucial da pergunta. Paul D. Waite

Sua resposta

7   a resposta
0

for concluído.

Provavelmente. Mas é uma péssima idéia se acostumar a confiar nisso, porque você será inútil para programas maiores que tenham que abrir um grande número de arquivos ao longo do tempo. Recontagemmaio mas você está preso ao CPython e não pode, por exemplo, tornar o programa 3x mais rápido, executando-o no PyPy, porque o PyPy tem um GC melhor. Apenas se acostume a liberar recursos assim que razoável. Não é realmente difícil. -1 user395760
E mesmo que o refcounting poupe você, você receberá umResourceWarning no Python 3.2 para cada arquivo que é automaticamente fechado. Sven Marnach
0

ou seja,

in_file = open(from_file); indata = in_file.read()

Eu acho que ele é o que você estava depois ..

0

O código Python a seguir irá realizar seu objetivo.

from contextlib import nested

with nested(open('input.txt', 'r'), open('output.txt', 'w')) as inp, out:
    indata = inp.read()
    ...
    out.write(out_data)
@ Lattyware, obrigado pela informação. Eu manterei em mente. astynax
contextlib.nested é inútil em versões mais recentes do Python. user395760
@ Dalnan Pior do que issocontextlib.nested() devemosNunca ser usado para abrir dois arquivos - se houver um erro ao abrir o segundo, o primeiro não será fechado. Este é um bug documentado e é uma das razões pelas quais ele está obsoleto em favor do novowith sintaxe. Gareth Latty
2

input é apenas um nome para o queopen retorna ao invés de conselhos que vocêdeveria para fazer o caminho mais curto.

Como outras respostas mencionam, neste caso em particular, o problema que você identificou corretamente não é um grande problema - seu script fecha rapidamente, então qualquer arquivo que você abrir será fechado rapidamente. Mas isso nem sempre é o caso, e a maneira usual de garantir que um arquivo será fechado depois de ter sido feito é usar umwith statement - que você descobrirá enquanto continua com o Python.

2
with open(from_file, 'r') as f:
  indata = f.read()

# outputs True
print f.closed
14

A maneira preferida de trabalhar com recursos em python é usargerenciadores de contexto:

 with open(infile) as fp:
    indata = fp.read()

owith A declaração cuida do fechamento do recurso e da limpeza.

Vocêpoderia escreva isso em uma linha se você quiser:

 with open(infile) as fp: indata = fp.read()

no entanto, isso é considerado um estilo ruim em python.

Você também pode abrir vários arquivos em umwith quadra:

with open(input, 'r') as infile, open(output, 'w') as outfile:
    # use infile, outfile

Engraçado, pergunteiexatamente a mesma pergunta de volta quando comecei a aprender python.

@Junuxx Isso não significa necessariamente lição de casa - isso pode ser um tutorial que ele está seguindo ou algo assim. De qualquer maneira, a resposta correta deve ser sempre dizer às pessoas como fazer da maneira certa, especialmente se não houver uma boa razão para fazer o contrário (ou, como neste caso, o contrário é estritamente uma má idéia). Gareth Latty
@Junuxx Eu não vejo razão para acreditar que é dever de casa, e se é - é uma tarefa estúpida, ensinar as pessoas a fazer coisas que nunca deveriam fazer no mundo real. O SO está aqui para dar um bom recurso, e isso não é conseguido dizendo às pessoas como fazer algo estúpido. Gareth Latty
@Lattyware:While working through this exercise... e# we could do these two on one line too, how?. Caso contrário, eu concordo e enviei +1 para essa resposta. Junuxx
@ thg435, não é uma maneira normal! Apenas objeto de arquivo implementa a interface do Gerenciador de Contexto. astynax
0
in_file = open(from_file).read(); out_file = open(to_file,'w').write(in_file)
Enquanto este código pode responder a pergunta, falta explicação. Por favor, considere adicionar texto para explicar o que ele faz, e por que ele responde a questão colocada. N. Wouda
Eu decidi então esta tarefa Jr Cord

Perguntas relacionadas