2012-01-01 13 views
11

ho iniziato a imparare Python con LPTHW e ho ottenuto di esercitare 16:Python: come scrivere più stringhe in una riga?

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

e sentire come un idiota perché io non riesco a capire uno dei apparentemente semplice "credito extra" gli incarichi che richiedono quanto segue:

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

Da condensare su una riga di codice. Ho provato alcuni dei seguenti:

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

Oppure:

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

Oppure:

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

non riesco proprio a farlo riscrivere la linea 1, linea 2, e riga3 archi tutti nella stessa linea. E ho provato varie altre combinazioni con e senza virgole, virgolette, ecc. Continuo a ricevere errori variabili, come la sintassi non valida o che ho troppi argomenti.

Qualsiasi aiuto (e una spiegazione dietro) sarebbe molto apprezzato. Grazie!

risposta

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

'\ n' ha senso solo all'interno di una stringa letterale. Senza le virgolette, non hai letterali stringa.

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

Ok, ora tutto è una stringa letterale. Ma vuoi che line1, line2, line3 non siano stringhe letterali. Hai bisogno di quelli come espressioni python per riferire le variabili in questione. Fondamentalmente, devi mettere le virgolette attorno a stringhe che sono in realtà testo come "\ n" ma non attorno a variabili.Se avete fatto questo, si potrebbe ottenere qualcosa di simile:

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

Che cosa è 2 2? Non è niente. Devi specificare su python come combinare i due pezzi. Quindi puoi avere 2 + 2 o 2 * 2 ma 2 2 non ha senso. In questo caso, usiamo aggiungiamo a combinare due stringhe

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

Passando,

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

Anche in questo caso \n senso solo all'interno di una stringa letterale. L'operatore% quando viene utilizzato per produrre stringhe utilizza una stringa come lato sinistro. Quindi hai bisogno di tutti i dettagli di formattazione all'interno di una stringa.

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

Ma questo produce 3 stringhe letterali, ne vuoi solo uno. Se avete fatto queste cose, scrittura lamentato perché eccettua una stringa, non 3. Così si potrebbe avere provato qualcosa di simile:

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

Ma si vuole scrivere la linea 1, linea 2, linea3 al file. In questo caso, stai tentando di formattare dopo che la scrittura è già terminata. Quando python esegue questo verrà eseguito il target.write prima di partire:

None % (line1, line2, line3) 

che farà nulla di utile. Per risolvere il problema che abbiamo bisogno di mettere il %() all'interno del .write()

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

Grazie per la risposta/spiegazione completa. Capisco davvero non solo la risposta corretta, ma quelle sbagliate e quello che sta succedendo qui. Grazie! – jstacks

+0

@jstacks, quindi la mia missione qui è completa! –

5

Il tuo ultimo tentativo sembra promettente. Esso dovrebbe essere simile:

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

questo si applica l'operatore % in una stringa (con 3 %s segnaposto) e una tupla di valori da sostituire (qui, le stringhe). Il risultato è la stringa formattata.

Così avresti bisogno di avvolgere che nella funzione che prende il risultato:

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

Non so davvero se t o dare a te o il '+' rispondere al segno di spunta. Tuttavia, non avrei mai pensato di usare '+' ma questa è una buona lezione di apprendimento. La parentesi qui è un'altra e ne apprezzo quella. Quando si utilizza questo metodo, sembra che mi vengano restituite delle virgolette ... come risolverei questo? Poiché la loro rimozione causa un errore di sintassi. – jstacks

+0

@jstacks, se vuoi aiuto con errori di sintassi, mostra sempre il codice e l'errore di sintassi. –

+0

Le virgolette erano perché continuavo a usare% r, usando% s correzioni che ... ma perché? So che "s" significa che mirerà specificamente a una stringa. Ma non funziona più in generale e riporta ancora una stringa? Perché non funziona allo stesso modo? Inoltre, quando si utilizza questo metodo, line2 e line3 sono leggermente rientrati. Perché sta succedendo e quale sarebbe la soluzione? – jstacks

4

Ecco un modo:

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

La ragione per la seguente non funziona

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

È che line1 è una variabile (nota non è quotata) ma '\n' è una stringa letterale (poiché è tra virgolette). L'operatore di addizione è sovraccarico perché le stringhe si concatenano (combinarle).

La ragione per cui questo non funziona:

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

è perché line1 è una variabile. Quando lo inserisci tra virgolette, non viene più considerato come una variabile.

+0

Ho provato (riga1 '\ n', riga 2 '\ n', riga3 '\ n') e anche questo non ha funzionato (anche provato con le virgole tra tutto). Qualche motivo per cui il + funziona ma la virgola no? Immagino che tratti tutto tra le virgole come argomento proprio anziché solo con variabili separate? Quindi, il + allevia questo allora? – jstacks

+0

@jstacks le virgole in una chiamata al metodo sono separatori per gli argomenti, quindi sì lo tratta come argomenti separati quando è previsto solo uno. Uno spazio tra non ha senso in Python, quindi è un errore. '+' ha precedenza più alta nell'ordine delle operazioni rispetto alla valutazione della funzione, e come ho detto sopra, più per la stringa è la concatenazione. Per esempio 'print" ciao "+" mondo "' è identico al 100% a 'stampa" helloworld "'. O per i numeri 'print 1 + 1' è identico a' print 2' perché il plus avviene prima della stampa. – Davy8

+0

Grazie Tra quello che tu e Winston avete pubblicato, ho sicuramente imparato un sacco. Stackoverflow è fantastico. – jstacks

2

sotto la linea funziona per me,

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

Prima che ho aggiunto

line = '\n' 

il mio codice come:

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 !' 
Problemi correlati