2012-01-01 15 views
11

he empezado a aprender Python con LPTHW y he llegado a ejercer 16:Python: ¿Cómo escribir varias cadenas en una línea?

http://learnpythonthehardway.org/book/ex16.html

Y siento como un idiota porque no puedo imaginar una de las aparentemente simple "crédito adicional" asignaciones que desean lo siguiente:

target.write(line1) 
target.write('\n') 
target.write(line2) 
target.write('\n') 
target.write(line3) 
target.write('\n') 

Se condensará en una línea de código. He intentado algunas de las siguientes:

target.write(line1 \n, line2 \n, line3 \n) 

O:

target.write('line1 \n, line2 \n, line3 \n') 

O:

target.write(%r \n, %r \n, %r \n) % (line1, line2, line3) 

No puedo conseguir que se vuelva a escribir la línea 1, línea 2 y línea 3 cadenas todo en la misma línea. Y he intentado varias otras combinaciones con y sin comas, comillas, etc. Sigo recibiendo varios errores, como Invalid Syntax o que tengo demasiados argumentos.

Cualquier ayuda (y una explicación detrás de esto) sería muy apreciada. ¡Gracias!

Respuesta

42
target.write(line1 \n, line2 \n, line3 \n) 

'\ n' sólo tienen sentido dentro de una cadena literal. Sin las comillas, no tiene literales de cadena.

target.write('line1 \n, line2 \n, line3 \n') 

Ok, ahora todo es una cadena literal. Pero desea que line1, line2, line3 no sean literales de cadena. Necesitas esos como expresiones de pitón para referir las variables en cuestión. Básicamente, debe poner comillas alrededor de cadenas que en realidad son texto como "\ n" pero no para variables.Si hiciera eso, que podría haber conseguido algo como:

target.write(line1 '\n' line2 '\n' line3 '\n') 

¿Cuál es 2 2? No es nada. Tienes que especificar a Python cómo combinar las dos piezas. Entonces puede tener 2 + 2 o 2 * 2, pero 2 2 no tiene ningún sentido. En este caso, utilizamos añadimos combinar dos cadenas

target.write(line + '\n' + line2 + '\n' + line3 + '\n') 

Cambiando de tema,

target.write(%r \n, %r \n, %r \n) % (line1, line2, line3) 

Una vez más \n sólo tiene sentido dentro de una cadena literal. El operador% cuando se usa para producir cadenas toma una cadena como su lado izquierdo. Entonces necesitas todo ese detalle de formateo dentro de una cadena.

target.write('%r \n', '%r \n', '%r \n') % (line1, line2, line3) 

Pero eso produce literales de 3 cadenas, solo desea una. Si hizo esto, escritura quejado porque exceptúa una cadena, no algo 3. Por lo que podría haber intentado como:

target.write('%r \n%r \n%r \n') % (line1, line2, line3) 

Pero desea escribir la línea 1, línea 2, línea 3 en el fichero. En este caso, está tratando de formatear después de que la escritura ya haya finalizado. Cuando ejecuta este pitón se ejecutará la primera target.write dejando:

None % (line1, line2, line3) 

¿Qué va a hacer nada útil. Para solucionar esto tenemos que poner el %() dentro del .write()

target.write('%r\n%r\n%r\n' % (line1, line2, line3)) 
+0

Gracias por esa respuesta/explicación exhaustiva. Realmente entiendo no solo la respuesta correcta, sino la incorrecta y lo que está sucediendo aquí. ¡Gracias! – jstacks

+0

@jstacks, ¡entonces mi misión aquí está completa! –

5

Su último intento parece prometedor. Debe quedar como:

"%s \n %s \n %s" % (line1, line2, line3) 

esto se aplica el operador % a una cadena (con 3 %s marcadores de posición) y una tupla de valores a sustituir (en este caso, cuerdas). El resultado es la cadena formateada.

Así que había necesidad de concluir que, en la función que toma el resultado:

target.write("%s \n %s \n %s" % (line1, line2, line3)) 
+0

Realmente no sé si t o darle a usted o al '+' la marca de verificación. Sin embargo, nunca hubiera pensado usar '+', pero esa es una buena lección de aprendizaje. El paréntesis aquí es otro y lo aprecio. Al usar este método, parece arrojarme comillas ... ¿cómo lo arreglaría? Porque eliminarlos causa un error de sintaxis. – jstacks

+0

@jstacks, si desea ayuda con los errores de sintaxis, siempre muéstrenos el código y el error de sintaxis. –

+0

Las comillas se debieron a que seguí usando% r, usando% s las correcciones que ... pero ¿por qué? Sé que 's' significa que se dirigirá específicamente a una cadena. ¿Pero no funciona de manera más amplia y aún trae una cadena? ¿Por qué no funciona igual? Además, cuando se usa este método line2 y line3 tienen una ligera sangría. ¿Por qué está sucediendo eso y cuál sería la solución? – jstacks

4

Aquí está una manera:

target.write(line1 + '\n' + line2 + '\n' + line3 + '\n') 

La razón por la siguiente no funciona

target.write(line1 \n, line2 \n, line3 \n) 

Es que line1 es una variable (tenga en cuenta que no se cita) pero '\n' es una cadena literal (ya que está entre comillas). El operador de adición está sobrecargado por cadenas para concatenarlas (combinarlas).

La razón esto no funciona:

target.write('line1 \n, line2 \n, line3 \n') 

se debe a line1 es una variable. Cuando lo pones entre comillas, ya no se trata como una variable.

+0

He intentado (línea 1 '\ n', línea 2 '\ n', línea 3 '\ n') y esto tampoco funcionó (también intenté con comas entre todo). ¿Alguna razón por la cual el + funciona pero la coma no? ¿Supongo que trata todo entre las comas como su propio argumento en lugar de solo uno con variables separadas? Entonces, el + alivia esto entonces? – jstacks

+0

@jstacks comas en una llamada a método son separadores para argumentos, así que sí lo trata como argumentos separados cuando solo se espera uno. Un espacio intermedio no tiene sentido en Python, por lo que es un error. '+' tiene una precedencia más alta en el orden de las operaciones que la evaluación de la función, y como mencioné anteriormente, más para la cadena es la concatenación. Por ejemplo 'print" hello "+" world "' es 100% idéntico a 'print" helloworld "'. O para los números 'print 1 + 1' es idéntico a' print 2' porque el más ocurre antes de la impresión. – Davy8

+0

Gracias Entre lo que usted y Winston han publicado, definitivamente he aprendido mucho. Stackoverflow es increíble. – jstacks

2

debajo de la línea funciona para mí,

target.write(line1 + line + line2 + line + line3 + line) 

Antes de que he añadido

line = '\n' 

mi código como:

from sys import argv 
script, filename = argv 
print 'Appending process starts on: %r' % filename 
target = open(filename, 'a') 
print 'Enter the contents:\t' 
line1 = raw_input('Next:\t') 
line2 = raw_input('Next:\t') 
line3 = raw_input('Next:\t') 
line = '\n' 
target.write(line1 + line + line2 + line + line3 + line) 
print 'Thank you !' 
Cuestiones relacionadas