python print end = ''

115

Mam ten skrypt Pythona, w którym muszę uruchomić gdal_retile.py

ale mam wyjątek w tej linii:

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

end=''Jest niepoprawna składnia. Ciekaw jestem, dlaczego i co prawdopodobnie zamierzał zrobić autor.

Jestem nowy w Pythonie, jeśli jeszcze nie zgadłeś.


Myślę, że główną przyczyną problemu jest to, że ten import zawodzi i dlatego należy go powstrzymać 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 *
Hath
źródło
2
Naprawdę pomaga, jeśli prześlesz dane śledzenia, aby jak najlepiej zdiagnozować otrzymany wyjątek. Oczywistym błędem składniowym jest brak cudzysłowów otwierających. Gdyby to zostało naprawione, nadal byłby to błąd składniowy w Pythonie 2, który nie ma funkcji drukowania bez __future__importu.
Mike Graham
2
Tak jak na bok, zmienne, które nie są, ClassNamespowinny zaczynać się małą literą.
Mike Graham
wrt / @Mike, zobacz python.org/dev/peps/pep-0008, aby uzyskać pełne wytyczne dotyczące nazewnictwa zmiennych i stylu kodowania w Pythonie. Dobrze jest przestrzegać wytycznych, ponieważ w Pythonie masz przywilej pracy z w większości spójną biblioteką i dzięki temu często możesz uniknąć zwykłej gry w zgadywanie (np. PHP), nawet podczas pracy z kodem innych osób.
Alan Plum
5
Prosząc o pomoc w przypadku błędów w przyszłości, zwłaszcza błędów składniowych , należy spróbować podać dokładny kod, który próbowałeś uruchomić , bez konieczności ponownego wpisywania.
Mike Graham
@Mike - zwykle nigdy nie zawracałbym sobie głowy wpisywaniem go ponownie, jednak nie mogłem tego zrobić, ponieważ kod znajdował się na zdalnym komputerze. W przyszłości na pewno będę bardziej ostrożny.
Hath

Odpowiedzi:

155

Czy na pewno używasz Pythona 3.x? Składnia nie jest dostępna w Pythonie 2.x, ponieważ printnadal jest instrukcją.

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

w Pythonie 2.x jest identyczny z

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

lub

print "foo" % bar, end=" "

tj. jako wezwanie do wypisania z krotką jako argumentem.

To oczywiście zła składnia (literały nie przyjmują argumentów słów kluczowych). W Pythonie 3.x printjest rzeczywistą funkcją, więc przyjmuje również argumenty słów kluczowych.

Prawidłowy idiom w Pythonie 2.x dla end=" ":

print "foo" % bar,

(zwróć uwagę na ostatni przecinek, oznacza to, że kończy się on spacją, a nie podziałem wiersza)

Jeśli chcesz mieć większą kontrolę nad wyjściem, rozważ użycie sys.stdoutbezpośrednio. To nie zrobi żadnej specjalnej magii z wyjściem.

Oczywiście w nieco nowszych wersjach Pythona 2.x (2.5 powinno go mieć, nie jestem pewien co do 2.4), możesz użyć __future__modułu, aby włączyć go w swoim pliku skryptu:

from __future__ import print_function

To samo dotyczy unicode_literalsi innych fajnych rzeczy ( with_statementna przykład). Nie zadziała to jednak w naprawdę starych wersjach (tj. Utworzonych przed wprowadzeniem tej funkcji) Pythona 2.x.

Alan Plum
źródło
1
Sprawdziłem moją wersję za pomocą dpkg -p pythoni była to wersja 2.xx.xx. Dziękuję bardzo, zastosowałem sugestię, aby ująć to w formie print "foo" %bar, i zadziałało idealnie.
Mehrad
Należy pamiętać, że istnieje (subtelna) różnica pomiędzy print foo, bariw print (foo, bar)Pythonie 2. Pierwsza jest printinstrukcją z dwoma elementami na liście „argumentów”; ta ostatnia jest printinstrukcją z pojedynczą krotką na liście argumentów.
chepner
Twój przykład print("foo" % bar, end=" ")nie zadziała, ponieważ barnie jest zdefiniowany; więc co jest barw twoim przykładzie? (Przynajmniej dla mnie z Pythonem 3.7)
Qaswed
50

Co powiesz na to:

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

Pozwala to na używanie printfunkcji w stylu Pythona 3.0 bez konieczności ręcznej edycji wszystkich wystąpień print:)

badp
źródło
17

W Pythonie 2.7 oto jak to zrobić

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

W Pythonie 3.x

myjob= 'hacker'
for c in myjob: print (c, end=' ')
#output 
h a c k e r 
Ritesh Karwa
źródło
5
Człowieku, po prostu rozwiązujesz problem, który mnie dezorientuje na kilka dni, po prostu pamiętam te gwizdki i stare sceny, ale nie lyris, a teraz w końcu zrozumiałem, co to za piosenka !!
Sphynx-HenryAY
@ Sphynx-HenryAY szczęśliwy, że mogę ci pomóc, bracie
Ritesh Karwa
W twoim drugim przykładzie wydaje się, że h a c k e r między znakami są spacje. Używam Pythona 3.7.3 i nie mam żadnych spacji end=''.
Nagev,
@Nagev po prostu wstaw spację między '' of end = ''
Ritesh Karwa
Dzięki, nie chcę spacji, po prostu pomyślałem, że widziałem twój kod bez spacji, ale wyjście było z odstępami, co wydawało się niespójne, to wszystko.
Nagev,
5

Przede wszystkim brakuje cytatu na początku, ale prawdopodobnie jest to błąd kopiowania / wklejania.

W Pythonie 3.x end=' 'część umieszcza spację po wyświetlanym ciągu zamiast nowej linii. Aby zrobić to samo w Pythonie 2.x, na końcu wstaw przecinek:

print "Building internam Index for %d tile(s) ..." % len(inputTiles),
interjay
źródło
Jestem zainteresowany zrobieniem czegoś takiego w Pythonie 2, jaka byłaby składnia? co masz na myśli, dodaj przecinek?
Rémi
1
@ Rémi Kod mojej odpowiedzi jest w Pythonie 2 ... I odnoszę się do przecinka na końcu.
interjay
4

Myślę, że on używa Pythona 3.0, a ty używasz Pythona 2.6.

Charles Beattie
źródło
1
Słuszna uwaga! print("foo" % bar, end = " ")wyzwala błąd składni w Pythonie 2.6 pod end = " "podobnie jak brakuje cytat robi :)
badp
3

To tylko wersja. Od Pythona 3.x print jest w rzeczywistości funkcją, więc teraz przyjmuje argumenty jak każda normalna funkcja.

Chodzi end=' 'tylko o to, aby powiedzieć, że chcesz wstawić spację po końcu instrukcji zamiast znaku nowego wiersza. W Pythonie 2.x musiałbyś to zrobić, umieszczając przecinek na końcu instrukcji print.

Na przykład w środowisku Python 3.x:

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

Daje następujący wynik:

0
1
2
3
4

Natomiast:

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

Jako wyjście da:

0 1 2 3 4
kdperspective
źródło
Odsyłacz do oficjalnej dokumentacji print()może być pomocny, ponieważ można tam zobaczyć domyślną wartość '\n'argumentu end: docs.python.org/3/library/functions.html#print
Qaswed
Nie zapomnij o spacji na końcu, jak w przykładzie powyżej: "hacker", wyjście powinno mieć postać "0 1 2 3 4" z odpowiednio ostatnią spacją
alant
2

Wygląda na to, że brakuje ci otwierającego podwójnego cudzysłowu. Próbować:

if Verbose:
   print("Building internam Index for %d tile(s) ..." % len(inputTiles), end=' ')
Will Robinson
źródło
1

Myślę, że autor prawdopodobnie miał na myśli:

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

Po tym brakuje mu wstępnego cytatu print(.

Należy zauważyć, że jak z Pythona 3.0 , printjest funkcją, w przeciwieństwie do rachunku, jeśli używasz starszych wersji Pythona odpowiednikiem byłoby:

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

Te endśrodki parametryczne, że linia staje się ' 'w końcu, zamiast znaku nowej linii. Odpowiednik we wcześniejszych wersjach Pythona to:

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

(dzięki Ignacio).

Dominic Rodger
źródło
1
Dodanie ,na końcu wystarczy.
Ignacio Vazquez-Abrams
1

POSŁUGIWAĆ SIĘ :: python3 filename.py

Miałem taki błąd, to wystąpiło, ponieważ mam dwie wersje Pythona zainstalowane na moim dysku, a mianowicie python2.7 i python3. Oto mój kod:

#!usr/bin/python

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

kiedy uruchamiam go za pomocą polecenia python lines.py, otrzymałem następujący błąd

#!usr/bin/python

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

kiedy uruchamiam go poleceniem, które python3 lines.pywykonałem pomyślnie

Subbu
źródło
3
#! / usr / bin / env python3
Mingliang Liu
1

W przypadku Pythona 2.7 miałem ten sam problem. Po prostu użyj „ from __future__ import print_function ” bez cudzysłowów, aby rozwiązać ten problem. Zapewnia to Pythonowi 2.6 i nowszym Pythonowi 2.x możliwość korzystania z funkcji drukowania Python 3.x.

Viraj Patil
źródło
1

Spróbuj tego, jeśli pracujesz z Pythonem 2.7:

from __future__ import print_function
scofield
źródło
Witamy w StackOverflow: jeśli wysyłasz kod, XML lub próbki danych, zaznacz te wiersze w edytorze tekstu i kliknij przycisk „próbki kodu” ({}) na pasku narzędzi edytora lub użyj Ctrl + K na klawiaturze, aby ładnie sformatować i podświetlić składnię!
WhatsThePoint
0

Nawet ja otrzymywałem dzisiaj ten sam błąd. I doświadczyłem interesującej rzeczy. Jeśli używasz Pythona 3.x i nadal otrzymujesz błąd, może to być powód:

Masz wiele wersji Pythona zainstalowanych na tym samym dysku. A kiedy naciskasz przycisk f5, pojawia się okno powłoki Pythona (wersji <3.x)

Otrzymałem dziś ten sam błąd i zauważyłem to. Zaufaj mi, kiedy wykonuję kod z odpowiedniego okna powłoki (w wersji 3.x), otrzymałem zadowalające wyniki

Biswajit Paul
źródło
0

musimy zaimportować nagłówek przed użyciem end='', ponieważ nie jest on uwzględniony w normalnym środowisku uruchomieniowym Pythona.

from __future__ import print_function

teraz będzie działać idealnie

sukantk
źródło
0

Kompatybilny z obu Python 2 i 3 :

sys.stdout.write('mytext')

Kompatybilny tylko z Pythonem 2

print 'mytext',

Kompatybilny tylko z Pythonem 3

print('mytext', end='')
JellicleCat
źródło