2010-08-24 10 views
19

que estoy haciendo Zed fantástica Learn Python The Hard Way Shaw, sino una cuestión adicional me ha dejado perplejos: Línea 9--10 podría escribirse en una sola línea, ¿cómo? He intentado algunos pensamientos diferentes, pero fue en vano. Podría seguir, pero ¿cuál sería la diversión en eso?Learn Python la manera dura Ejercicio 17 Pregunta extra (S)

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 toda la secuencia de comandos en una línea. No estoy exactamente seguro de lo que quiere decir con eso.

Siéntase libre de ayudar a lo que le apetezca: al dar la respuesta o simplemente dando a entender --- y quizás incluyendo una respuesta colapsado o escondidos a la pregunta.

+0

Para expresiones más difíciles, debe evitar rellenar tanto como sea posible en una línea. – leoluk

+0

Si no tiene ningún bloque sangrado, puede simplemente unir cada línea, terminando con un punto y coma. * Muy * mala forma, pero si estás empeñado en ello ... –

+1

O si realmente quieres ser un dolor de trasero: http://effbot.org/pyfaq/is-it- possible-to-write-ofuscado-one-liners-in-python.htm –

Respuesta

18
indata = open(from_file).read() 
+0

Esto también se puede hacer al escribir. –

+13

Sí, aunque esto (así como la solución de dos líneas) dejará el archivo abierto más tiempo de lo necesario, por lo que debe evitar esto en código real (una forma mejor de hacerlo en una línea es 'con abierto (archivo_desde) como f: indata = f.read() ', si quiere guardar líneas solo por el placer de hacerlo) – delnan

+0

Esto parece ser el más cercano al Python que se haya enseñado hasta ese ejercicio. Simplemente no veo cómo alguien podría inferir una solución de este tipo a partir de un fondo completamente nuevo; también sé algo de Java, pero no habría pensado en algo así. ¿Existe una terminología especial para esta medida específica? No puedo entender cómo alguien podría resolver esto, pero tal vez las preguntas adicionales solo apuntan a un nivel más alto de lo que presumía. De todos modos, muchas gracias.Probablemente no lo habría descubierto sin la solución explícita. Lo mismo se aplica a la ayuda de todos. – Kiwi

8

shutil es la manera de hacer copias de archivo de una sola línea en Python:

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

Poner el import shutil, sys en la misma línea como este (con un punto y coma en el medio, por supuesto) lo haría sin embargo, ser estilísticamente tonto ;-).

+0

Esto no parece abordar la pregunta, sin embargo? Por lo general, los tutoriales de programación se centran en los conceptos, por lo que las respuestas que utilizan diferentes conceptos parecen menos valiosas para el alumno. –

+0

"Menos valioso" que _what_? '';' join' de todas las líneas sin comentario? -) –

6

bien sólo se puede hacer "sustitución algebraica", ¿verdad? ... suponiendo que no se preocupan por la "interfaz de usuario" ...

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

recuerda' to_file = argv [2] ', etc. –

+0

Ejercicio dejado para el lector? :) –

1

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

abierta (TO_FILE, 'w'). Escribir ((from_file) .read abierta())

seguido por un simple 'imprimir' para la retroalimentación de verificación

de impresión "archivo% s copiado en% s" % (from_file, TO_FILE)

que debería haber una línea de sexto que sustituye al original '' output.close '', pero estoy confundido acerca de cómo hacer esto sin el '' salida '' variables ? Ahh, dado 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 he escrito aquí que he resuelto y me he introducido en gedit. Genial, realmente disfruto el desafío mental y el apoyo de la comunidad.

Editar: contestado a mi propia pregunta

1

tratar el siguiente código:

import shutil, sys; shutil.copy(sys.argv[0], sys.argv[2]) 
3
from sys import argv 
open(argv[2], 'w').write(open(argv[1]).read()) 
+0

Esto es lo más cercano que pude obtener también. Supongo que la declaración de importación podría estar en la misma línea, pero no sé cómo hacerlo aún/más 2 líneas parece lo suficientemente buena :) –

+0

'from sys import argv; open (argv [2], 'w'). write (open (argv [1]). read()) 'Esto funciona bien y solo tiene 69 columnas en un editor de texto. – iyrin

+0

Nota del libro: 'Eso; depende; en ; cómo ; tú ; definir; uno ; línea; de; código. – iyrin

0

Él responde a esta continuación en la sección "Preguntas de los estudiantes comunes"

ninguna manera se puede hacer esto una línea!

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

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

se puede escribir como

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

Hey kiwi (y cualquier otro que encuentra esto!),

estoy en el mismo ejercicio y creo que he agrietado.

Hay dos lecturas posibles de la frase "Podría hacer que esta línea sea larga" de Shaw.

  1. Podía hacer que el script Python una línea larga, sobre la importación de todos los comandos necesarios a partir de los módulos, por ejemplo from sys import argv, etc.
  2. Pudo copiar el contenido de un archivo a otro en una línea con el comando línea.

Personalmente, creo que se refiere a este último, pero voy a explicar ambas soluciones por el bien de aprender!

La primera (Long) solución: usted debe reconocer que necesita los import x from Y líneas en el archivo de Python, de lo contrario argv y exist no funcionará, ya que sólo se ha hecho referencia implícitamente, es decir, que no le han dejado claro a Python que desea usar estas funciones.

La siguiente cosa que hacer es eliminar todo el código irrelevante, con código irrelevantes ser que está escrito para el beneficio del usuario, es decir print, raw_input(), len(), etc.

Si hace esto, habrá dejó 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 empezar a anidar las variables y función en unos a los otros. Este es el mismo principio que en matemáticas cuando se puede 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 trabaja en esto, se puede simplificar el código a:

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 una gran cantidad de ; para unir todas las líneas de código y vio-la has terminado.

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

El segundo (Corto) solución:

Si nos fijamos en su sección 'Lo que debes ver', que utiliza el gato en el terminal. Esto es corto para la concatenación, que es un medio de conectar cadenas juntas.Si se combina con> puede sobrescribir el contenido de un archivo con otro en una línea:

cat from_file.txt > to_file.txt 

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

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

Regeneración apreciada, sólo empezó a hacer esto hace dos días ...

0

El cortar todo lo que no es necesario, todas las 'características que no necesita' Zed como lo pone, y se obtiene una línea. Tiene incluso menos de 80 caracteres de longitud, ¡no puede obtener mucho más 'pitónico' que eso!

desde sys import argv; s, f, t = argv; (Abierta (t, 'w'). Escribir (abierta (f) .read()))

0

Todo lo que está diciendo es que se puede utilizar 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() 

se puede hacer eso con todo el trozo de código si se quería

0

también estoy haciendo el mismo libro en línea. He intentado esto, y funcionó:

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

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

0

Pasamos un buen rato con esto. Al responder esto, estaba buscando una solución que conservara la funcionalidad, utilicé los comandos de archivo del ejercicio y no usé ";" para combinar líneas. Lo más cerca que podría venir es

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

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