Вопрос по python – В Python, как я могу открыть файл и прочитать его в одной строке, и все же иметь возможность закрыть файл после этого?

5

Работая над этим упражнением, я столкнулся с проблемой.

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()

Линия# we could do these two on one line too, how? это то, что меня смущает. Единственный ответ, который я мог придумать, был:

indata = open(from_file).read()

Это выполнено так, как я хотел, но требует, чтобы я удалил:

input.close()

поскольку входная переменная больше не существует. Как тогда я могу выполнить эту близкую операцию?

Как бы вы решили это?

Всем спасибо. Я чувствую себя лучше. @Paul D. Waite Спасибо за редактирование моего вопроса. Теперь все намного понятнее. yoonsi
добро пожаловать! Часто кому-то еще легче понять, в чем суть вопроса. Paul D. Waite

Ваш Ответ

6   ответов
2
with open(from_file, 'r') as f:
  indata = f.read()

# outputs True
print f.closed
14

Предпочтительным способом работы с ресурсами в Python является использованиеконтекстные менеджеры:

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

with Заявление заботится о закрытии ресурса и очистке.

Выcould напишите это в одной строке, если хотите:

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

однако это считается плохим стилем в питоне.

Вы также можете открыть несколько файлов вwith блок:

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

Достаточно смешно я спросилточно такой же вопрос назад, когда я начал изучать Python.

@ Lattyware: давай, это явно домашнее задание, и в то время как следует использоватьwithКажется очевидным, что это не тот ответ, который учитель хочет услышать в данной конкретной ситуации.
Хороший совет стиля, но не отвечает на вопрос, так как он не в одной строке.
@astynax: да, "предпочтительный" звучит лучше.
@Junuxx Правильный ответ на этот вопросdon't do it on one line, Это лучший ответ.
@ thg435, это не стандартный путь! Просто файл-объект реализует интерфейс диспетчера контекста.
0

Просто используйте точку с запятой между существующей строкой кода, т.е.

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

Я думаю, что это то, что вы были после ..

0
in_file = open(from_file).read(); out_file = open(to_file,'w').write(in_file)
Я так решил эту задачу
Хотя этот код может ответить на вопрос, в нем нет объяснения. Пожалуйста, рассмотрите возможность добавления текста, чтобы объяснить, что он делает и почему отвечает на поставленный вопрос.
0

Файл будет закрыт автоматически и безопасно после завершения вашего сценария.

Наверное. Но это действительно плохая идея - привыкнуть полагаться на это, потому что тогда вы будете бесполезны для более крупных программ, которые должны открывать большое количество файлов с течением времени. Refcountingmay сохранить вас, но тогда вы привязаны к CPython и, например, не можете сделать программу в 3 раза быстрее, запустив ее на PyPy, потому что PyPy имеет лучший GC. Просто привыкайте освобождать ресурсы как можно скорее. Это действительно не сложно. -1
И даже если пересчет спасет вас, вы получитеResourceWarning в Python 3.2 для каждого файла, который автоматически закрывается.
2

Вы должны думать об этом как о упражнении, чтобы понять, чтоinput это просто название для чегоopen возвращается, а не как совет, который выought сделать это более коротким путем.

Как отмечают другие ответы, в данном конкретном случае проблема, которую вы правильно определили, не является большой проблемой - ваш скрипт закрывается довольно быстро, поэтому все файлы, которые вы открываете, будут закрываться довольно быстро. Но это не всегда так, и обычный способ гарантировать, что файл закроется после того, как вы закончили с ним, - это использоватьwith заявление - о котором вы узнаете, продолжая работу с Python.

Похожие вопросы