python print end = ''


115

У мене є цей скрипт python, куди мені потрібно запустити gdal_retile.py

але я отримую виняток у цьому рядку:

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

end=''Є недійсним синтаксис. Мені цікаво, чому і що, мабуть, автор мав намір зробити.

Я новачок у python, якщо ви ще не здогадалися.


Я думаю, що першопричиною проблеми є те, що цей імпорт провалюється, і тому його потрібно містити 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
Це дійсно допомагає, якщо ви опублікуєте прослідкування, щоб найкраще діагностувати отриманий виняток. Очевидна синтаксична помилка - це відсутність вступних лапок. Якщо це було виправлено, все одно це буде помилка синтаксису в Python 2, який не має функції друку без __future__імпорту.
Майк Грехем

2
Як ранку в сторону, змінні, що не ClassNamesповинні починатися з малої літери.
Майк Грехем

wrt / @Mike, див. python.org/dev/peps/pep-0008 для повних вказівок щодо стилів іменування та стилю кодування в Python. Це гарна ідея дотримуватися вказівок, тому що в Python ви маєте привілей працювати з переважно послідовною бібліотекою і, таким чином, часто можете уникати звичайної гри на здогадки (наприклад, PHP), навіть коли ви працюєте з кодом інших людей.
Алан Плюм

5
Коли ви звертаєтесь за допомогою щодо помилок у майбутньому, особливо синтаксичних помилок , вам слід спробувати вказати точний код, який ви намагалися запустити , без будь-якого введення тексту.
Майк Грехем

@Mike - я зазвичай ніколи не заважаю вводити його знову, проте мені не вдалося це зробити, оскільки код був на віддаленому комп'ютері. Я буду впевнений, що буду бути обережнішими в майбутньому.
Хат

Відповіді:


155

Ви впевнені, що використовуєте Python 3.x? Синтаксис недоступний у Python 2.x, оскільки printце все ще є оператором.

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

в Python 2.x ідентичний

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

або

print "foo" % bar, end=" "

тобто як заклик до друку з кортежем як аргументом.

Це очевидно поганий синтаксис (літерали не беруть аргументи ключових слів). У Python 3.x print- це фактична функція, тому вона також бере аргументи ключових слів.

Правильна ідіома в Python 2.x для end=" ":

print "foo" % bar,

(зверніть увагу на заключну кому, це змушує закінчити рядок пробілом, а не розривом рядка)

Якщо ви хочете більше контролювати вихід, подумайте sys.stdoutбезпосередньо про використання . Це не зробить ніякої особливої ​​магії з виходом.

Звичайно, у дещо останніх версіях Python 2.x (у 2.5 має бути, а не про 2.4) ви можете використовувати __future__модуль, щоб увімкнути його у вашому файлі сценарію:

from __future__ import print_function

Те саме стосується unicode_literalsі деяких інших приємних речей ( with_statementнаприклад,). Це не буде працювати в дійсно старих версіях (тобто створених до введення функції) Python 2.x, однак.


1
Я перевірив свою версію за допомогою dpkg -p pythonверсії 2.xx.xx. Дякую вам велике, я застосував пропозицію, щоб викласти його у формі, print "foo" %bar, і це спрацювало чудово.
Мехрад

Майте на увазі, є (тонка) різниця між print foo, barі print (foo, bar)в Python 2. Перший - це printтвердження з двома пунктами в його списку "аргументів"; останнє - це printтвердження з одним кортежем у його аргументі списку.
чепнер

Ваш приклад print("foo" % bar, end=" ")не буде працювати, оскільки barне визначено; так що barу вашому прикладі? (Принаймні для мене з Python 3.7)
Qaswed

50

Як щодо цього:

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

Це дозволяє використовувати printфункцію стилю Python 3.0 без необхідності вручну редагувати всі події print:)


17

У python 2.7 ось як це зробити

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

У пітоні 3.x

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

5
Людина, ти просто вирішиш проблему, що бентежить мене пару днів, я просто пам’ятаю ці свистячі сцени, а не лірики, і тепер я нарешті з'ясував, що це за пісня !!
Сфінкс-Генріхай

@ Sphynx-HenryAY із задоволенням допоможе тобі братику
Ritesh Karwa

У вашому другому прикладі видно, що h a c k e r між символами є пробіли. Я використовую Python 3.7.3 і не маю пробілів end=''.
Нагев

@Nagev просто поставив пробіл між '' of end = ''
Ritesh

Дякую, я не хочу місця, просто я подумав, що побачив ваш код без пробілу, але вихід був рознесений, що здалося непослідовним, ось і все.
Нагев

5

Перш за все, вам не вистачає цитати на початку, але це, мабуть, помилка копіювання / вставки.

У Python 3.x end=' 'частина розмістить пробіл після відображається рядка замість нового рядка. Щоб зробити те ж саме в Python 2.x, ви поставите кому в кінці:

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

Мене закликають зробити щось подібне в python 2, який би був синтаксис? що означає додати кому?
Ремі

1
@ Rémi Код у моїй відповіді є в Python 2 ... І я маю на увазі кому в кінці.
interjay

4

Я думаю, що він використовує Python 3.0, а ви використовуєте Python 2.6.


1
Гарна думка! print("foo" % bar, end = " ")запускає синтаксичну помилку в Python 2.6, end = " "як і відсутність цитати :)
badp

3

Це просто версія версії. Оскільки Python 3.x друк насправді є функцією, то тепер він бере аргументи, як і будь-яка звичайна функція.

Це end=' 'просто сказати, що ви хочете пробіл після закінчення оператора замість нового символу рядка. У Python 2.x вам слід це зробити, поставивши кому в кінці оператора print.

Наприклад, у середовищі Python 3.x:

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

Дасть такий вихід:

0
1
2
3
4

Де як:

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

Дасть як вихід:

0 1 2 3 4

Посилання на офіційну документацію print()може бути корисним, оскільки там можна побачити значення '\n'за замовчуванням для аргументу end: docs.python.org/3/library/functions.html#print
Qaswed

Не забувайте пробіл у кінці, як у прикладі вище: "хакер" вихід повинен бути "0 1 2 3 4" з останнім пробілом відповідно
alant

2

Схоже, вам просто не вистачає вступної подвійної цитати. Спробуйте:

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

1

Я думаю, що автор, мабуть, мав на увазі:

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

Після нього не вистачає початкової цитати print(.

Зауважте, що як для Python 3.0 , printце функція на відміну від оператора, якщо ви використовуєте старіші версії Python, еквівалент буде:

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

В endозначає параметр , що лінія отримує ' 'в кінці , а не символ нового рядка. Еквівалент у попередніх версіях Python:

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

(дякую Ігнасіо).


1
Додавання ,кінця зробить це.
Ігнасіо Васкес-Абрамс

1

ВИКОРИСТАННЯ :: python3 filename.py

У мене була така помилка, ця сталася, тому що у мене на диску встановлені дві версії python, а саме python2.7 та python3. Наступним був мій код:

#!usr/bin/python

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

коли я запускаю його командою, python lines.pyя отримав таку помилку

#!usr/bin/python

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

коли я запускаю його командою, яку python3 lines.pyя успішно виконував


3
#! / usr / bin / env python3
Mingliang Лю

1

Для python 2.7 у мене був той самий випуск. Просто вирішіть цю проблему, використовуючи " from __future__ import print_function " без лапок. Це гарантує, що Python 2.6 та пізніші Python 2.x можуть використовувати функцію друку Python 3.x.


1

Спробуйте це, якщо ви працюєте з python 2.7:

from __future__ import print_function

Ласкаво просимо до StackOverflow: якщо ви розміщуєте код, XML або зразки даних, будь ласка, виділіть ці рядки в текстовому редакторі та натисніть кнопку "зразки коду" ({}) на панелі інструментів редактора або використовуючи Ctrl + K на клавіатурі для гарного форматування і синтаксис виділити це!
WhatsThePoint

0

Навіть я сьогодні отримував ту саму помилку. І я пережив цікаву річ. Якщо ви використовуєте python 3.x і все ще отримуєте помилку, це може бути причиною:

У вас є кілька версій python, встановлених на одному диску. І коли ви натискаєте кнопку f5, спливає вікно оболонки пітона (вер. <3.x)

Я сьогодні отримував таку ж помилку, і помітив це. Повірте мені, коли я виконую свій код із відповідного вікна оболонки (з версії 3.x), я отримав задовільні результати


0

перед тим end='', як використовувати , нам потрібно імпортувати заголовок , оскільки він не входить у звичайний час виконання пітона.

from __future__ import print_function

вона працюватиме ідеально зараз


0

Сумісний з обома Python 2 та 3 :

sys.stdout.write('mytext')

Сумісний лише з Python 2

print 'mytext',

Сумісний лише з Python 3

print('mytext', end='')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.