python print end = ''


115

Ho questo script Python in cui devo eseguire gdal_retile.py

ma ottengo un'eccezione su questa riga:

if Verbose:
   print("Building internam Index for %d tile(s) ..." % len(inputTiles), end=' ')

La end=''sintassi non è valida. Sono curioso di sapere perché e cosa probabilmente intendeva fare l'autore.

Sono nuovo in Python se non l'hai già indovinato.


Penso che la causa principale del problema sia che queste importazioni stanno fallendo e quindi è necessario contenere questa importazione from __future__ import print_function

try: 
   from osgeo import gdal
   from osgeo import ogr
   from osgeo import osr
   from osgeo.gdalconst import *
except:
   import gdal
   import ogr
   import osr
   from gdalconst import *

2
È davvero utile pubblicare il traceback per diagnosticare al meglio l'eccezione che ricevi. L'ovvio errore di sintassi è dovuto alla mancanza di virgolette di apertura. Se fosse stato risolto, sarebbe ancora un errore di sintassi in Python 2, che non ha la funzione di stampa senza __future__un'importazione.
Mike Graham

2
A parte questo, le variabili che non lo sono ClassNamesdovrebbero iniziare con una lettera minuscola.
Mike Graham

wrt / @Mike, vedere python.org/dev/peps/pep-0008 per le linee guida complete per la denominazione delle variabili e lo stile di codifica in Python. È una buona idea aderire alle linee guida perché in Python si ha il privilegio di lavorare con una libreria per lo più coerente e quindi spesso si può evitare il solito gioco di indovinelli (es. PHP) anche quando si lavora con il codice di altre persone.
Alan Plum

5
Quando chiedi aiuto con errori in futuro, in particolare errori di sintassi , dovresti provare a fornire il codice esatto che hai provato a eseguire , senza dover ridigitare.
Mike Graham

@ Mike - Di solito non mi preoccuperei mai di digitarlo di nuovo, tuttavia non sono stato in grado di farlo perché il codice era su un computer remoto. Sarò sicuro di stare più attento in futuro.
Ha il

Risposte:


155

Sei sicuro di utilizzare Python 3.x? La sintassi non è disponibile in Python 2.x perché printè ancora un'istruzione.

print("foo" % bar, end=" ")

in Python 2.x è identico a

print ("foo" % bar, end=" ")

o

print "foo" % bar, end=" "

cioè come una chiamata a print con una tupla come argomento.

Questa è ovviamente una cattiva sintassi (i letterali non accettano argomenti di parole chiave). In Python 3.x printè una funzione effettiva, quindi accetta anche argomenti di parole chiave.

L'idioma corretto in Python 2.x per end=" "è:

print "foo" % bar,

(nota la virgola finale, questo fa terminare la riga con uno spazio anziché con un'interruzione di riga)

Se desideri un maggiore controllo sull'output, considera l'utilizzo sys.stdoutdiretto. Questo non farà alcuna magia speciale con l'output.

Ovviamente in versioni piuttosto recenti di Python 2.x (2.5 dovrebbe averlo, non sono sicuro della 2.4), puoi usare il __future__modulo per abilitarlo nel tuo file di script:

from __future__ import print_function

Lo stesso vale per unicode_literalse altre cose carine ( with_statement, ad esempio). Tuttavia, questo non funzionerà nelle versioni molto vecchie (ovvero create prima dell'introduzione della funzionalità) di Python 2.x.


1
Ho controllato la mia versione usando dpkg -p pythoned era la versione 2.xx.xx. Grazie mille, ho applicato il suggerimento di metterlo sotto forma di print "foo" %bar, e ha funzionato perfettamente.
Mehrad

Tieni presente che c'è una (sottile) differenza tra print foo, bare print (foo, bar)in Python 2. Il primo è printun'istruzione con due elementi nella sua lista di "argomenti"; quest'ultima è printun'istruzione con una singola tupla nella sua lista di argomenti.
chepner

Il tuo esempio print("foo" % bar, end=" ")non funzionerà, poiché barnon è definito; quindi qual è il bartuo esempio? (Almeno per me con Python 3.7)
Qaswed il

50

Cosa ne pensi di questo:

#Only for use in Python 2.6.0a2 and later
from __future__ import print_function

Ciò consente di utilizzare la printfunzione di stile Python 3.0 senza dover modificare manualmente tutte le occorrenze di print:)


17

In Python 2.7 ecco come lo fai

mantra = 'Always look on the bright side of life'
for c in mantra: print c,

#output
A l w a y s   l o o k   o n   t h e   b r i g h t   s i d e   o f   l i f e

In python 3.x

myjob= 'hacker'
for c in myjob: print (c, end=' ')
#output 
h a c k e r 

5
Amico, hai appena risolto un problema che mi ha confuso per un paio di giorni, ricordo solo il fischio e la scena dei vecchi tempi ma non i testi, e ora finalmente ho capito cos'è quella canzone !!
Sphynx-HenryAY

@ Sphynx-HenryAY felice di aiutarti fratello
Ritesh Karwa

Nel secondo esempio, sembra che ci siano h a c k e r spazi tra i caratteri. Sto usando Python 3.7.3 e non ottengo alcuno spazio con end=''.
Nagev

@Nagev ha appena messo uno spazio tra '' of end = ''
Ritesh Karwa

Grazie, non voglio lo spazio, è solo che pensavo di aver visto il tuo codice senza lo spazio eppure l'output era spaziato, il che sembrava incoerente, tutto qui.
Nagev

5

Prima di tutto, ti manca una citazione all'inizio, ma questo è probabilmente un errore di copia / incolla.

In Python 3.x, la end=' 'parte inserirà uno spazio dopo la stringa visualizzata invece di una nuova riga. Per fare la stessa cosa in Python 2.x, dovresti inserire una virgola alla fine:

print "Building internam Index for %d tile(s) ..." % len(inputTiles),

Sono interessato a fare qualcosa di simile in Python 2 quale sarebbe la sintassi? cosa intendi aggiungere una virgola?
Rémi

1
@ Rémi Il codice nella mia risposta è in Python 2 ... E mi riferisco alla virgola alla fine.
Interjay

4

Penso che stia usando Python 3.0 e tu stai usando Python 2.6.


1
Buon punto! print("foo" % bar, end = " ")attiva un errore di sintassi in Python 2.6 end = " "proprio come fa la virgoletta mancante :)
badp

3

Questa è solo una cosa di versione. Poiché Python 3.x, print è in realtà una funzione, quindi ora accetta argomenti come qualsiasi funzione normale.

Il end=' 'è solo per dire che si vuole uno spazio dopo la fine della dichiarazione, invece di un carattere di nuova riga. In Python 2.x dovresti farlo inserendo una virgola alla fine dell'istruzione print.

Ad esempio, in un ambiente Python 3.x:

while i<5:
    print(i)
    i=i+1

Fornirà il seguente output:

0
1
2
3
4

Mentre:

while i<5:
    print(i, end = ' ')
    i=i+1

Darà come output:

0 1 2 3 4

Un collegamento alla documentazione ufficiale di print()potrebbe essere utile, poiché lì si può vedere il valore predefinito '\n'per l'argomento end: docs.python.org/3/library/functions.html#print
Qaswed

Non dimenticare uno spazio alla fine come nell'esempio sopra: "hacker" l'output qui dovrebbe essere "0 1 2 3 4" con un ultimo spazio corrispondentemente
alant

2

Sembra che ti manchi solo una virgoletta doppia di apertura. Provare:

if Verbose:
   print("Building internam Index for %d tile(s) ..." % len(inputTiles), end=' ')

1

Penso che l'autore probabilmente intendesse:

if Verbose:
   print("Building internam Index for %d tile(s) ..." % len(inputTiles), end=' ')

Dopo gli manca una citazione iniziale print(.

Nota che a partire da Python 3.0 , printè una funzione al contrario di un'istruzione, se stai usando versioni precedenti di Python l'equivalente sarebbe:

print "Building internam Index for %d tile(s) ..." % len(inputTiles)

Il endparametro significa che la riga arriva ' 'alla fine anziché un carattere di nuova riga. L'equivalente nelle versioni precedenti di Python è:

print "Building internam Index for %d tile(s) ..." % len(inputTiles),

(grazie Ignacio).


1
L'aggiunta di un ,alla fine lo farà.
Ignacio Vazquez-Abrams

1

USO :: python3 filename.py

Ho avuto un tale errore, si è verificato perché ho due versioni di python installate sul mio disco, vale a dire python2.7 e python3. Di seguito era il mio codice:

#!usr/bin/python

f = open('lines.txt')
for line in f.readlines():
        print(line,end ='')

quando lo eseguo dal comando python lines.pyho ricevuto il seguente errore

#!usr/bin/python

f = open('lines.txt')
for line in f.readlines():
        print(line,end ='')

quando lo eseguo con il comando che python3 lines.pyho eseguito con successo


3
#! / usr / bin / env python3
Mingliang Liu

1

Per Python 2.7 ho avuto lo stesso problema. Basta usare " from __future__ import print_function " senza virgolette per risolvere questo problema. Ciò garantisce che Python 2.6 e versioni successive Python 2.x possano utilizzare la funzione di stampa Python 3.x.


1

Prova questo se stai lavorando con Python 2.7:

from __future__ import print_function

Benvenuto in StackOverflow: se inserisci codice, XML o campioni di dati, evidenzia quelle righe nell'editor di testo e fai clic sul pulsante "Esempi di codice" ({}) sulla barra degli strumenti dell'editor o utilizza Ctrl + K sulla tastiera per formattare correttamente e la sintassi lo evidenzi!
WhatsThePoint

0

Anche io stavo ricevendo lo stesso errore oggi. E ho vissuto una cosa interessante. Se stai usando python 3.x e ricevi ancora l'errore, potrebbe essere una ragione:

Hai più versioni di Python installate sulla stessa unità. E quando si preme il pulsante f5, viene visualizzata la finestra della shell di Python (della ver. <3.x)

Oggi ho ricevuto lo stesso errore e ho notato quella cosa. Credetemi, quando eseguo il mio codice dalla corretta finestra della shell (della ver. 3.x), ho ottenuto risultati soddisfacenti


0

abbiamo bisogno di importare un'intestazione prima dell'uso end='', poiché non è inclusa nel normale runtime di python.

from __future__ import print_function

ora funzionerà perfettamente


0

Compatibile con entrambi Python 2 e 3 :

sys.stdout.write('mytext')

Compatibile solo con Python 2

print 'mytext',

Compatibile solo con Python 3

print('mytext', end='')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.