Aprende Python de la manera difícil Ejercicio 17 Pregunta (S) adicional

Estoy haciendo el fantástico Learn Python The Hard Way de Zed Shaw, pero una pregunta adicional me ha dejado perplejo: la línea 9–10 podría escribirse en una línea, ¿cómo? He intentado algunos pensamientos diferentes, pero en vano. Podría seguir adelante, pero ¿cuál sería la diversión en eso?

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 también escribe que podría hacer todo el guión en una línea. No estoy exactamente seguro de lo que quiere decir con eso.

Siéntase libre de ayudarme como quiera: dando la respuesta o simplemente insinuando — y quizás incluyendo una respuesta oculta o colapsada a la pregunta.

 indata = open(from_file).read() 

shutil es la forma de hacer copias de archivos de una sola línea en Python:

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

Sin import shutil, sys poner el import shutil, sys en la misma línea que esta (con un punto y coma en el medio, por supuesto) sería import shutil, sys ;-).

Bueno, solo puedes hacer “sustitución algebraica”, ¿verdad? … asumiendo que no te importa la “interfaz de usuario” …

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

Estoy de acuerdo con la sustitución algebraica mencionada por @ dash-tom-bang. Mi crédito funcional del ejercicio 17 adicional tiene 5 líneas. La operación se está llevando a cabo en una línea.

open (to_file, ‘w’). write (open (from_file) .read ())

seguido de una simple ‘impresión’ para comentarios de verificación

imprima “Archivo% s copiado a% s”% (from_file, to_file)

Debería tener una sexta línea que reemplaza al ” output.close ” original, pero estoy confundido acerca de cómo hacerlo sin la variable ” output ”. Ahh, ya que ahora no tengo ninguna variable de salida no hay nada que cerrar.

btw- Es un poco espeluznante para mí ver la misma línea exacta que escribí aquí, en la que me he entrenado y entrado en gedit. Genial, realmente disfruto el desafío mental y el apoyo de la comunidad.

Edición: respondí a mi propia pregunta

Prueba el siguiente código:

 import shutil, sys; shutil.copy(sys.argv[0], sys.argv[2]) 
 output = open(to_file, 'w') output.write(indata) 

Se puede escribir como

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

Hola Kiwi (y quien más encuentre esto!),

Estoy en el mismo ejercicio y creo que lo he roto.

Hay dos lecturas posibles de la broma de Shaw “Podría hacer que esta línea sea larga”.

  1. Podría hacer que el script de Python se extendiera una línea, al importar todos los comandos necesarios de los módulos, por ejemplo, from sys import argv , etc.
  2. Él podría copiar el contenido de un archivo a otro en una línea usando la línea de comando.

Personalmente creo que quiere decir lo último, ¡pero explicaré ambas soluciones por el bien del aprendizaje!

La primera solución (larga): debe reconocer que requiere la import x from líneas y en el archivo de Python, de lo contrario, argv y exist no funcionarán porque solo serán referenciadas implícitamente, es decir, no lo ha dejado claro. Python que desea utilizar estas funciones.

Lo siguiente que debe hacer es eliminar todo el código irrelevante, con el código irrelevante que se escribe para el beneficio del usuario, es decir, print , raw_input() , len() , etc.

Si haces esto, te quedarás con:

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

Para hacer esto aún más corto, puede comenzar a anidar las variables y la función entre sí. Este es el mismo principio que en matemáticas cuando puedes definir una función y luego sustituir la variable que representa esa función en otra función.

Por ejemplo:

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

Si trabajas con esto, puedes simplificar el código hasta:

 from sys import argv from os.path import exists script, from_file, to_file = argv (open(to_file, 'w').write(open(from_file).read())) 

A continuación, puede utilizar un montón de ; para enlazar todas las líneas de código y viola estás listo.

Nota: No necesita cerrar los archivos, como hizo en el original, ya que Python los cerrará automáticamente al ejecutar el script.

La segunda solución (Corta):

Si miras su sección “Lo que deberías ver”, usa cat en la terminal. Esta es la abreviatura de concatenación, que es un medio para conectar cadenas entre sí. Si lo combinas con> puedes sobrescribir el contenido de un archivo con otro en una línea:

 cat from_file.txt > to_file.txt 

Eso es. Una línea que tomará el contenido de un archivo y lo pondrá en otro.

Por supuesto, ambas soluciones no son perfectas, ya que la primera no es realmente una línea y la segunda ni siquiera utiliza Python.

Comentarios apreciados, solo empecé a hacer esto hace dos días …

Recorte todo lo que no necesita, todas las ‘características que no necesita’ como lo indica Zed, y obtiene una línea. Incluso tiene menos de 80 caracteres de longitud, ¡no se puede obtener mucho más ‘pythonic’ que eso!

desde sys import argv; s, f, t = argv; (abrir (t, ‘w’). escribir (abrir (f). leer ()))

Todo lo que dice es que puedes usar un punto y coma para poner dos líneas en una línea y hacer que se ejecute

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

Podrías hacer eso con todo el código si quisieras

También estoy haciendo el mismo libro en línea. Intenté esto, y funcionó:

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

En otras palabras, abrí el archivo que estaba copiando en el modo de escritura y luego inserté el contenido del archivo que estaba copiando, después de abrirlo y leerlo, en la función de escritura. Revisé mis archivos y funcionó. ¡Hurra!

Me divertí un poco con este. Al responder esto, estaba buscando una solución que preservara la funcionalidad, usara los comandos de archivo sobre los que se trataba el ejercicio y no usé “;” para combinar lineas. Lo más cerca que pude venir es

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

No es exactamente la misma funcionalidad que solicita la entrada en lugar de tomar la línea de comandos. Pero una única línea que hace el trabajo mientras usa los comandos de archivo en el ejercicio y evita concatenar líneas usando el punto y coma.

Él contesta esto a continuación en la sección “Preguntas comunes de los estudiantes”:

¡De ninguna manera puedes hacer esta una línea!

Ese ; depende en ; cómo ; tú ; definir uno ; línea de código.