tutoriales - Aprende Python de manera difícil Ejercicio 17 Pregunta(S) adicional
python para principiantes (13)
É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.
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 qué 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.
Bueno, simplemente puedes hacer "sustitución algebraica", ¿verdad? ... asumiendo que no te importa la "interfaz de usuario" ...
open(to_file, ''w'').write(open(from_file).read())
Estoy de acuerdo con la sustitución algebraica mencionada por @ dash-tom-bang. El crédito adicional de mi ejercicio de funcionamiento 17 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 ''impresión'' simple 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.
Edit: respondí mi propia pregunta
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".
- 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. - É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 han dejado claro. Python que desea utilizar estas funciones.
Lo siguiente que debe hacer es eliminar todo el código irrelevante, siendo 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 ...
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 sola línea que hace el trabajo mientras usa los comandos de archivo en el ejercicio y evita concatenar líneas con punto y coma.
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 ()))
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!
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
prueba el siguiente código:
import shutil, sys; shutil.copy(sys.argv[0], sys.argv[2])
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 la import shutil, sys
en la misma línea que esta (con un punto y coma en el medio, por supuesto) sería estilísticamente ridículo ;-).
from sys import argv
open(argv[2], ''w'').write(open(argv[1]).read())
indata = open(from_file).read()
output = open(to_file, ''w'')
output.write(indata)
Se puede escribir como
open(to_file, ''w'').write(indata)