fin d'impression python = ''

115

J'ai ce script python où je dois exécuter gdal_retile.py

mais j'obtiens une exception sur cette ligne:

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

La end=''syntaxe n'est pas valide. Je suis curieux de savoir pourquoi et ce que l'auteur voulait probablement faire.

Je suis nouveau sur python si vous ne l'avez pas déjà deviné.


Je pense que la cause première du problème est que ces importations échouent et qu'il faut donc contenir cette importation 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
la source
2
Cela aide vraiment si vous publiez le traçage pour mieux diagnostiquer l'exception que vous recevez. L'erreur de syntaxe évidente vient du manque de guillemets d'ouverture. Si cela était corrigé, ce serait toujours une erreur de syntaxe dans Python 2, qui n'a pas la fonction d'impression sans __future__importation.
Mike Graham
2
Soit dit en passant, les variables qui ne le sont pas ClassNamesdevraient commencer par une lettre minuscule.
Mike Graham
wrt / @Mike, voir python.org/dev/peps/pep-0008 pour les instructions complètes sur la dénomination des variables et le style de codage en Python. C'est une bonne idée de respecter les directives car en Python, vous avez le privilège de travailler avec une bibliothèque essentiellement cohérente et pouvez donc souvent éviter le jeu de devinettes habituel (par exemple PHP) même lorsque vous travaillez avec le code d'autres personnes.
Alan Plum
5
Lorsque vous demandez de l'aide pour des erreurs à l'avenir, en particulier des erreurs de syntaxe , vous devriez essayer de fournir le code exact que vous avez essayé d'exécuter , sans aucune retaper.
Mike Graham
@Mike - Je ne prendrais généralement jamais la peine de le taper à nouveau, mais je n'ai pas pu le faire car le code était sur un ordinateur distant. Je serai sûr d'être plus prudent à l'avenir.
Hath

Réponses:

155

Êtes-vous sûr d'utiliser Python 3.x? La syntaxe n'est pas disponible dans Python 2.x car il prints'agit toujours d'une instruction.

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

en Python 2.x est identique à

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

ou

print "foo" % bar, end=" "

c'est-à-dire comme un appel à imprimer avec un tuple comme argument.

C'est évidemment une mauvaise syntaxe (les littéraux ne prennent pas d'arguments de mot-clé). En Python 3.x printest une fonction réelle, donc elle prend aussi des arguments de mots-clés.

L'idiome correct dans Python 2.x pour end=" "est:

print "foo" % bar,

(notez la virgule finale, cela fait terminer la ligne avec un espace plutôt qu'un saut de ligne)

Si vous voulez plus de contrôle sur la sortie, envisagez d'utiliser sys.stdoutdirectement. Cela ne fera aucune magie spéciale avec la sortie.

Bien sûr, dans les versions un peu récentes de Python 2.x (2.5 devrait l'avoir, pas sûr de 2.4), vous pouvez utiliser le __future__module pour l'activer dans votre fichier de script:

from __future__ import print_function

Il en va de même avec d' unicode_literalsautres choses intéressantes ( with_statementpar exemple). Cela ne fonctionnera pas dans les versions vraiment anciennes (c'est-à-dire créées avant l'introduction de la fonctionnalité) de Python 2.x, cependant.

Alan Plum
la source
1
J'ai vérifié ma version en utilisant dpkg -p pythonet c'était la version 2.xx.xx. Merci beaucoup, j'ai appliqué la suggestion de le mettre sous la forme de print "foo" %bar, et cela a parfaitement fonctionné.
Mehrad
Gardez à l'esprit qu'il existe une (subtile) différence entre print foo, baret print (foo, bar)en Python 2. La première est une printinstruction avec deux éléments dans sa liste "d'arguments"; ce dernier est une printinstruction avec un seul tuple dans sa liste d'arguments.
chepner
Votre exemple print("foo" % bar, end=" ")ne fonctionnera pas, car il barn'est pas défini; alors qu'est-ce que barvotre exemple? (Au moins pour moi avec Python 3.7)
Qaswed
50

Que dis-tu de ça:

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

Cela vous permet d'utiliser la printfonction de style Python 3.0 sans avoir à modifier manuellement toutes les occurrences de print:)

badp
la source
17

En python 2.7, voici comment procéder

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

En python 3.x

myjob= 'hacker'
for c in myjob: print (c, end=' ')
#output 
h a c k e r 
Ritesh Karwa
la source
5
Mec, tu viens de résoudre un problème qui me déroute pendant quelques jours, je me souviens juste de ces sifflets et de ces scènes d'autrefois mais pas des lyris, et maintenant je comprends enfin ce qu'est cette chanson !!
Sphynx-HenryAY
@ Sphynx-HenryAY heureux de vous aider mon frère
Ritesh Karwa
Sur votre deuxième exemple, il semble qu'il y h a c k e r ait des espaces entre les caractères. J'utilise Python 3.7.3 et je n'obtiens aucun espace avec end=''.
Nagev
@Nagev vient de mettre un espace entre '' of end = ''
Ritesh Karwa
Merci, je n'ai pas veux d'espace, c'est juste que je pensais avoir vu votre code sans l'espace pourtant la sortie était espacée, ce qui semblait incohérent, c'est tout.
Nagev
5

Tout d'abord, il vous manque un devis au début mais il s'agit probablement d'une erreur de copier / coller.

Dans Python 3.x, la end=' 'pièce placera un espace après la chaîne affichée au lieu d'une nouvelle ligne. Pour faire la même chose dans Python 2.x, vous mettriez une virgule à la fin:

print "Building internam Index for %d tile(s) ..." % len(inputTiles),
interjay
la source
Je suis intéressé de faire quelque chose comme ça en python 2 quelle serait la syntaxe? que voulez-vous dire ajouter une virgule?
Rémi
1
@ Rémi Le code de ma réponse est en Python 2 ... Et je fais référence à la virgule à la fin.
entre le
4

Je pense qu'il utilise Python 3.0 et que vous utilisez Python 2.6.

Charles Beattie
la source
1
Bon point! print("foo" % bar, end = " ")déclenche une erreur de syntaxe dans Python 2.6 sous end = " "comme le fait la citation manquante :)
badp
3

C'est juste une chose de version. Depuis Python 3.x, l'impression est en fait une fonction, elle prend donc maintenant des arguments comme n'importe quelle fonction normale.

C'est end=' 'juste pour dire que vous voulez un espace après la fin de l'instruction au lieu d'un caractère de nouvelle ligne. Dans Python 2.x, vous devrez le faire en plaçant une virgule à la fin de l'instruction d'impression.

Par exemple, dans un environnement Python 3.x:

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

Donnera la sortie suivante:

0
1
2
3
4

Tandis que:

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

Donnera comme sortie:

0 1 2 3 4
kdperspective
la source
Un lien vers la documentation officielle de print()pourrait être utile, car on peut y voir la valeur par défaut '\n'de l'argument end: docs.python.org/3/library/functions.html#print
Qaswed
N'oubliez pas un espace à la fin comme dans l'exemple ci-dessus: "hacker" la sortie ici devrait être "0 1 2 3 4" avec un dernier espace correspondant
alant le
2

Il semble que vous manquez juste un guillemet double d'ouverture. Essayer:

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

Je pense que l'auteur voulait probablement dire:

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

Il manque une citation initiale après print(.

Notez qu'à partir de Python 3.0 , printest une fonction par opposition à une instruction, si vous utilisez des versions plus anciennes de Python, l'équivalent serait:

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

Le endparamètre signifie que la ligne arrive ' 'à la fin plutôt qu'un caractère de nouvelle ligne. L'équivalent dans les versions antérieures de Python est:

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

(merci Ignacio).

Dominic Rodger
la source
1
Ajouter un ,à la fin le fera.
Ignacio Vazquez-Abrams
1

UTILISATION :: python3 filename.py

J'ai eu une telle erreur, cela s'est produit parce que j'ai deux versions de python installées sur mon lecteur, à savoir python2.7 et python3. Voici mon code:

#!usr/bin/python

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

quand je l'exécute par la commande, python lines.pyj'ai l'erreur suivante

#!usr/bin/python

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

quand je l'exécute par la commande que python3 lines.pyj'ai exécutée avec succès

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

Pour python 2.7, j'ai eu le même problème. Utilisez simplement " from __future__ import print_function " sans guillemets pour résoudre ce problème. Cela garantit que Python 2.6 et les versions ultérieures Python 2.x peuvent utiliser la fonction d'impression Python 3.x.

Viraj Patil
la source
1

Essayez celui-ci si vous travaillez avec python 2.7:

from __future__ import print_function
Scofield
la source
Bienvenue dans StackOverflow: si vous publiez des échantillons de code, XML ou de données, veuillez mettre en évidence ces lignes dans l'éditeur de texte et cliquer sur le bouton "exemples de code" ({}) dans la barre d'outils de l'éditeur ou en utilisant Ctrl + K sur votre clavier pour bien formater et la syntaxe le met en évidence!
WhatsThePoint
0

Même moi, je recevais la même erreur aujourd'hui. Et j'ai vécu une chose intéressante. Si vous utilisez python 3.x et que vous obtenez toujours l'erreur, cela peut être une raison:

Vous avez plusieurs versions de python installées sur le même lecteur. Et lorsque vous appuyez sur le bouton f5, la fenêtre du shell python (de la ver. <3.x) apparaît

J'avais la même erreur aujourd'hui et j'ai remarqué cette chose. Croyez-moi, lorsque j'exécute mon code à partir de la fenêtre shell appropriée (de la version 3.x), j'ai obtenu des résultats satisfaisants

Biswajit Paul
la source
0

nous devons importer un en-tête avant de l'utiliser end='', car il n'est pas inclus dans l'exécution normale de python.

from __future__ import print_function

ça fonctionnera parfaitement maintenant

Soukantk
la source
0

Compatible avec les deux Python 2 et 3 :

sys.stdout.write('mytext')

Compatible uniquement avec Python 2

print 'mytext',

Compatible uniquement avec Python 3

print('mytext', end='')
JellicleCat
la source