python print end = ''

115

Eu tenho este script python onde preciso executar gdal_retile.py

mas recebo uma exceção nesta linha:

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

o end='' sintaxe é inválida. Estou curioso para saber o porquê e o que o autor provavelmente pretendia fazer.

Sou novo em python, se você ainda não adivinhou.


Acho que a causa raiz do problema é que essas importações estão falhando e, portanto, deve-se conter essa importação 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 *
Tem
fonte
2
Realmente ajuda se você postar o traceback para diagnosticar melhor a exceção que você recebe. O erro de sintaxe óbvio é a falta de aspas iniciais. Se isso fosse corrigido, ainda seria um erro de sintaxe no Python 2, que não tem a função de impressão sem __future__importação.
Mike Graham
2
À parte, as variáveis ​​que não são ClassNamesdevem começar com uma letra minúscula.
Mike Graham
wrt / @Mike, consulte python.org/dev/peps/pep-0008 para obter as diretrizes completas para nomenclatura de variáveis ​​e estilo de codificação em Python. É uma boa ideia seguir as diretrizes porque no Python você tem o privilégio de trabalhar com uma biblioteca bastante consistente e, portanto, pode evitar o jogo de adivinhação usual (por exemplo, PHP), mesmo quando está trabalhando com o código de outras pessoas.
Alan Plum,
5
Ao pedir ajuda com erros no futuro, especialmente erros de sintaxe , você deve tentar fornecer o código exato que tentou executar , sem qualquer redigitação.
Mike Graham
@Mike - Eu normalmente nunca me incomodaria em digitá-lo novamente, porém não consegui fazer isso porque o código estava em um computador remoto. Terei a certeza de ser mais cuidadoso no futuro.
Hath

Respostas:

155

Tem certeza de que está usando Python 3.x? A sintaxe não está disponível no Python 2.x porque printainda é uma instrução.

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

em Python 2.x é idêntico a

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

ou

print "foo" % bar, end=" "

ou seja, como uma chamada para imprimir com uma tupla como argumento.

Obviamente, essa sintaxe é ruim (literais não aceitam argumentos de palavra-chave). No Python 3.x printé uma função real, portanto, também aceita argumentos de palavra-chave.

O idioma correto no Python 2.x para end=" "é:

print "foo" % bar,

(observe a vírgula final, isso faz com que a linha termine com um espaço em vez de uma quebra de linha)

Se você quiser mais controle sobre a saída, considere usar sys.stdout diretamente. Isso não fará nenhuma mágica especial com a saída.

Claro, em versões um tanto recentes do Python 2.x (2.5 deve ter, não tenho certeza sobre 2.4), você pode usar o __future__módulo para habilitá-lo em seu arquivo de script:

from __future__ import print_function

O mesmo acontece com unicode_literalse algumas outras coisas boas ( with_statementpor exemplo). Isso não funcionará em versões realmente antigas (ou seja, criadas antes do recurso ser introduzido) do Python 2.x.

Alan Plum
fonte
1
Verifiquei minha versão usando dpkg -p pythone era a versão 2.xx.xx. Muito obrigado, apliquei a sugestão de colocá-lo na forma de print "foo" %bar, e funcionou perfeitamente bem.
Mehrad
Lembre-se de que há uma diferença (sutil) entre print foo, bare print (foo, bar)no Python 2. O primeiro é uma printinstrução com dois itens em sua lista de "argumentos"; o último é uma printinstrução com uma única tupla em sua lista de argumentos.
chepner de
Seu exemplo print("foo" % bar, end=" ")não funcionará, pois barnão está definido; então o que está barem seu exemplo? (Pelo menos para mim com Python 3.7)
Qaswed
50

Que tal agora:

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

Isso permite que você use a printfunção de estilo Python 3.0 sem ter que editar manualmente todas as ocorrências de print:)

badp
fonte
17

No python 2.7, aqui está como você faz

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

Em python 3.x

myjob= 'hacker'
for c in myjob: print (c, end=' ')
#output 
h a c k e r 
Ritesh Karwa
fonte
5
Cara, você acabou de resolver um problema que me confundiu por alguns dias, eu só me lembro daquele apito e da cena dos velhos tempos, mas não da letra, e agora eu finalmente descobri que música é essa !!
Sphynx-HenryAY
@ Sphynx-HenryAY feliz em ajudá-lo irmão
Ritesh Karwa
Em seu segundo exemplo, parece que h a c k e r há espaços entre os caracteres. Estou usando o Python 3.7.3 e não recebo nenhum espaço com end=''.
Nagev
@Nagev basta colocar um espaço entre '' do fim = ''
Ritesh Karwa
Obrigado, não quero o espaço, só que pensei ter visto o seu código sem o espaço, mas a saída estava espaçada, o que parecia inconsistente, só isso.
Nagev
5

Em primeiro lugar, está faltando uma citação no início, mas provavelmente é um erro de copiar / colar.

No Python 3.x, a end=' 'parte colocará um espaço após a string exibida em vez de uma nova linha. Para fazer a mesma coisa no Python 2.x, você colocaria uma vírgula no final:

print "Building internam Index for %d tile(s) ..." % len(inputTiles),
interjay
fonte
Estou interessado em fazer algo assim em python 2, qual seria a sintaxe? o que você quer dizer com adicionar uma vírgula?
Rémi
1
@ Rémi O código em minha resposta está em Python 2 ... E estou me referindo à vírgula no final.
intervalo de
4

Acho que ele está usando Python 3.0 e você está usando Python 2.6.

Charles Beattie
fonte
1
Bom ponto! print("foo" % bar, end = " ")aciona um erro de sintaxe no Python 2.6 em, end = " "assim como a citação ausente :)
badp
3

Isso é apenas uma coisa de versão. Como o Python 3.x, a impressão é na verdade uma função, então agora ela recebe argumentos como qualquer função normal.

O end=' 'é só para dizer que você quer um espaço após o fim da instrução em vez de um caractere de nova linha. No Python 2.x você teria que fazer isso colocando uma vírgula no final da instrução de impressão.

Por exemplo, quando em um ambiente Python 3.x:

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

Fornecerá a seguinte saída:

0
1
2
3
4

Enquanto que:

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

Dará como saída:

0 1 2 3 4
kdperspective
fonte
Um link para a documentação oficial do print()pode ser útil, já que é possível ver o valor padrão '\n'para o argumento end: docs.python.org/3/library/functions.html#print
Qaswed
Não se esqueça de um espaço no final como o exemplo acima: "hacker" a saída aqui deve ser "0 1 2 3 4" com um último espaço correspondentemente
alant
2

Parece que está faltando uma aspa dupla de abertura. Experimentar:

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

Acho que o autor provavelmente quis dizer:

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

Ele está perdendo uma citação inicial depois print(.

Observe que, a partir do Python 3.0 , printé uma função e não uma instrução; se você estiver usando versões mais antigas do Python, o equivalente seria:

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

O endparâmetro significa que a linha fica ' 'no final em vez de um caractere de nova linha. O equivalente nas versões anteriores do Python é:

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

(obrigado Ignacio).

Dominic Rodger
fonte
1
Adicionar um ,ao final vai resolver.
Ignacio Vazquez-Abrams
1

USAR :: python3 filename.py

Eu tive esse erro, isso ocorreu porque eu tenho duas versões do python instaladas na minha unidade, ou seja, python2.7 e python3. A seguir estava meu código:

#!usr/bin/python

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

quando o executo pelo comando python lines.py, recebo o seguinte erro

#!usr/bin/python

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

quando o executo pelo comando python3 lines.py, executei com sucesso

Subbu
fonte
3
#! / usr / bin / env python3
Mingliang Liu
1

Para o python 2.7, tive o mesmo problema. Basta usar " from __future__ import print_function " sem aspas para resolver esse problema. Isso garante que o Python 2.6 e posterior Python 2.x pode usar a função de impressão do Python 3.x.

Viraj Patil
fonte
1

Experimente este se estiver trabalhando com o python 2.7:

from __future__ import print_function
Scofield
fonte
Bem-vindo ao StackOverflow: se você postar código, XML ou amostras de dados, destaque essas linhas no editor de texto e clique no botão "amostras de código" ({}) na barra de ferramentas do editor ou usando Ctrl + K no teclado para formatar de forma adequada e a sintaxe destaca isso!
WhatsThePoint
0

Até eu estava recebendo o mesmo erro hoje. E experimentei uma coisa interessante. Se você estiver usando o python 3.x e ainda receber o erro, pode ser um motivo:

Você tem várias versões de python instaladas na mesma unidade. E quando você pressiona o botão f5, a janela do shell python (da versão <3.x) aparece

Eu estava recebendo o mesmo erro hoje e percebi isso. Acredite em mim, quando executo meu código na janela de shell adequada (da versão 3.x), obtive resultados satisfatórios

Biswajit Paul
fonte
0

precisamos importar um cabeçalho antes de usar end='', pois ele não está incluído no tempo de execução normal do python.

from __future__ import print_function

deve funcionar perfeitamente agora

sukantk
fonte
0

Compatível com ambos Python 2 e 3 :

sys.stdout.write('mytext')

Compatível apenas com Python 2

print 'mytext',

Compatível apenas com Python 3

print('mytext', end='')
JellicleCat
fonte