Подтвердить что ты не робот

Изучите Python Hard Way Упражнение 17 Дополнительный вопрос (S)

Я делаю Zed Shaw фантастически Изучите Python The Hard Way, но дополнительный вопрос меня озадачил: Line 9-10 как написано в одной строке? Я пробовал разные мысли, но безрезультатно. Я мог бы двигаться дальше, но что было бы забавно в этом?

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."

Zed также пишет, что он мог бы сделать весь script в одной строке. Я не совсем уверен, что он имеет в виду.

Не стесняйтесь помогать мне, как бы вы ни хотели: давая ответ или просто намекая --- и, возможно, включая сложенный или скрытый ответ на вопрос.

4b9b3361

Ответ 1

indata = open(from_file).read()

Ответ 2

shutil - способ сделать копии однострочного файла в Python:

shutil.copy(sys.argv[1], sys.argv[2])

Помещение import shutil, sys в ту же строку, что и эта (с точкой с запятой между конечностями), однако, будет стилистически тупой; -).

Ответ 3

Ну, вы можете просто сделать "алгебраическую замену", правильно?... если вы не заботитесь о "пользовательском интерфейсе"...

open(to_file, 'w').write(open(from_file).read())

Ответ 4

from sys import argv
open(argv[2], 'w').write(open(argv[1]).read())

Ответ 5

Я согласен с алгебраической заменой, упомянутой @dash-tom-bang. Мое функционирование Экзамен 17 дополнительных кредитов имеет 5 линий. Операция выполняется в одной строке.

open (to_file, 'w'). write (open (from_file).read())

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

print "Файл% s скопирован в% s" % (from_file, to_file)

У меня должна быть 6-я строка, которая заменяет исходный '' output.close '', но я смущен тем, как это сделать без переменной '' output ''? Ahh, так как теперь у меня нет выходной переменной, закрывать нечего.

btw- Мне немного жутким, чтобы увидеть ту же самую точную строку, что и я, и я вошел в gedit. Отличный материал, я действительно наслаждаюсь умственной задачей и поддержкой сообщества.

Изменить: ответили на мой вопрос

Ответ 6

попробуйте следующий код:

import shutil, sys; shutil.copy(sys.argv[0], sys.argv[2])

Ответ 7

Он отвечает на это ниже в разделе "Общие вопросы для студентов":

Вы не можете сделать эту одну строку!

Это; зависит;; как; вы; определить; один; линия; of; код.

Ответ 8

output = open(to_file, 'w')
output.write(indata) 

может быть записано как

open(to_file, 'w').write(indata)

Ответ 9

Было немного весело с этим. Отвечая на это, я искал решение, которое сохраняло функциональность, использовало команды файлов, в которых выполнялось упражнение, и не использовал ";" объединить линии. Ближе всего я мог прийти

open(input("Out?: "), 'w').write(open(input("In?: ")).read())

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

Ответ 10

Эй Киви (и кто-нибудь еще это найдет!),

Я нахожусь в одном упражнении, и я считаю, что я его взломал.

Есть два возможных показания Шоу "Я мог бы сделать эту линию длинной" дразнить.

  • Он мог бы сделать Python script одной строкой длиной, после импорта всех необходимых команд из модулей, например from sys import argv и т.д.
  • Он мог скопировать содержимое одного файла в другой в одной строке с помощью командной строки.

Я лично думаю, что он имеет в виду последний, но я объясню оба решения ради обучения!

Первое (длинное) решение: Вы должны признать, что вам требуются строки import x from y в файле Python, в противном случае argv и exist не будут работать, потому что они будут только косвенно ссылаться, то есть вы не указали это ясно на Python, что вы хотите использовать эти функции.

Следующее, что нужно сделать, это удалить все нерелевантные коды, причем не имеет значения код, написанный для пользователя, т.е. print, raw_input(), len() и т.д.

Если вы сделаете это, вы останетесь с:

from sys import argv
from os.path import exists

script, from_file, to_file = argv

indata = open(from_file).read()

out_file = open(to_file, 'w')
out_file.write(indata)

out_file.close()
in_file.close() 

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

Например:

y = x + 3
z = y, which is essentially z = (x + 3)

Если вы это проделаете, вы можете упростить код до:

from sys import argv
from os.path import exists

script, from_file, to_file = argv

(open(to_file, 'w').write(open(from_file).read()))

Затем вы можете использовать множество ;, чтобы связать все строки кода и vio-la, которые вы сделали.

Примечание. Вам не нужно закрывать файлы, как это было в оригинале, поскольку Python автоматически закрывает их при выполнении script.

Второе (короткое) решение:

Если вы посмотрите на раздел "Что вы должны видеть", он использует кошку в терминале. Это краткое для конкатенации, которое является средством соединения строк вместе. Если вы объедините его s > , вы можете переписать содержимое одного файла другим в одну строку:

cat from_file.txt > to_file.txt

Что это. Одна строка, которая будет содержать содержимое одного файла и помещать его в другое.

Конечно, оба решения не идеальны, так как первая не является действительно одной строкой, а вторая даже не использует Python!

Обратная связь оценена, я только начал делать это два дня назад...

Ответ 11

Отрезать все, что вам не нужно, все "функции, которые вам не нужны", как это делает Зед, и вы получаете одну строку. Он даже меньше 80 символов в длину, не может получить гораздо больше "pythonic", чем это!

из sys import argv; s, f, t = argv; (open (t, 'w'). write (open (f).read()))

Ответ 12

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

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

Вы можете сделать это со всей частью кода, если хотите

Ответ 13

Я тоже делаю ту же книгу в Интернете. Я пробовал это, и он работал:

open(to_file, 'w').write(open(from_file).read())

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

Ответ 14

Следующая строка работала для меня:

open(to_file, 'w').write(open(from_file).read())