конец печати Python = ''

116

У меня есть этот скрипт 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 - Обычно я никогда не стал бы печатать его снова, однако я не смог этого сделать, так как код был на удаленном компьютере. Я обязательно буду осторожнее в будущем.
Hath

Ответы:

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.xprint это фактическая функция, поэтому она также принимает аргументы ключевого слова.

Правильная идиома в 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, и оно отлично сработало.
Mehrad
Имейте в виду, что существует (тонкая) разница между print foo, barи print (foo, bar)в Python 2. Первый - это printоператор с двумя элементами в списке «аргументов»; последний - это printоператор с одним кортежем в списке аргументов.
chepner
Ваш пример 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

В python 3.x

myjob= 'hacker'
for c in myjob: print (c, end=' ')
#output 
h a c k e r 
Ритеш Карва
источник
5
Чувак, ты просто решил проблему, сбивавшую меня с толку на пару дней, я просто помню те свистки и старые сцены, но не лирис, и теперь я наконец понял, что это за песня !!
Sphynx-HenryAY
@ Sphynx-HenryAY рад помочь тебе, брат
Ритеш Карва
Во втором примере кажется, что h a c k e r между символами есть пробелы. Я использую Python 3.7.3, и у меня вообще нет пробелов end=''.
Nagev
@Nagev просто поставил пробел между '' of end = ''
Ритеш Карва
Спасибо, мне не нужен пробел, просто я подумал, что видел ваш код без пробела, но вывод был разнесен, что казалось противоречивым, вот и все.
Nagev 04
5

Прежде всего, вам не хватает цитаты в начале, но, вероятно, это ошибка копирования / вставки.

В Python 3.x end=' 'часть будет помещать пробел после отображаемой строки вместо новой строки. Чтобы сделать то же самое в Python 2.x, вы должны поставить запятую в конце:

print "Building internam Index for %d tile(s) ..." % len(inputTiles),
interjay
источник
Мне интересно сделать что-то подобное в 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 вам нужно будет сделать это, поставив запятую в конце оператора печати.

Например, в среде 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
kdперспектива
источник
Ссылка на официальную документацию print()может быть полезна, поскольку там можно увидеть значение '\n'аргумента по умолчанию end: docs.python.org/3/library/functions.html#print
Qaswed
Не забудьте пробел в конце, как в примере выше: "hacker", вывод здесь должен быть "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 Liu
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, появляется окно оболочки Python (версии <3.x).

Сегодня у меня была такая же ошибка, и я заметил это. Поверьте, когда я выполняю свой код из правильного окна оболочки (версии 3.x), я получаю удовлетворительные результаты

Бисваджит Пол
источник
0

нам нужно импортировать заголовок перед использованием end='', поскольку он не включен в обычную среду выполнения python.

from __future__ import print_function

теперь он будет работать отлично

сукантк
источник
0

Совместим как с Python 2, так и с 3 :

sys.stdout.write('mytext')

Совместим только с Python 2

print 'mytext',

Совместим только с Python 3

print('mytext', end='')
JellicleCat
источник