python print end = ''

115

Saya memiliki skrip python ini di mana saya harus menjalankan gdal_retile.py

tapi saya mendapatkan pengecualian pada baris ini:

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

The end=''sintaks tidak valid. Saya ingin tahu mengapa, dan apa yang mungkin ingin dilakukan oleh penulisnya.

Saya baru mengenal python jika Anda belum menebaknya.


Saya pikir akar penyebab masalahnya adalah bahwa impor ini gagal dan oleh karena itu impor ini harus dihentikan 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
sumber
2
Sangat membantu jika Anda memposting traceback untuk mendiagnosis pengecualian yang Anda terima dengan baik. Kesalahan sintaks yang jelas adalah dari kurangnya kutipan pembuka. Jika itu diperbaiki, itu masih akan menjadi kesalahan sintaks di Python 2, yang tidak memiliki fungsi cetak tanpa __future__impor.
Mike Graham
2
Selain itu, variabel yang tidak ClassNamesharus dimulai dengan huruf kecil.
Mike Graham
wrt / @Mike , lihat python.org/dev/peps/pep-0008 untuk panduan lengkap penamaan variabel dan gaya pengkodean di Python. Sebaiknya patuhi pedoman karena dengan Python Anda memiliki hak istimewa untuk bekerja dengan pustaka yang sebagian besar konsisten dan karenanya sering kali dapat menghindari permainan tebak-tebakan biasa (misalnya PHP) bahkan saat Anda bekerja dengan kode orang lain.
Alan Plum
5
Saat meminta bantuan untuk kesalahan di masa mendatang, terutama kesalahan sintaks , Anda harus mencoba memberikan kode persis seperti yang Anda coba jalankan , tanpa mengetik ulang.
Mike Graham
@ Mike - Saya biasanya tidak akan repot-repot mengetiknya lagi, namun saya tidak dapat melakukannya karena kode tersebut ada di komputer jarak jauh. Saya pasti akan lebih berhati-hati di masa depan.
Apakah

Jawaban:

155

Apakah Anda yakin Anda menggunakan Python 3.x? Sintaksnya tidak tersedia di Python 2.x karena printmasih berupa pernyataan.

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

di Python 2.x identik dengan

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

atau

print "foo" % bar, end=" "

yaitu sebagai panggilan untuk mencetak dengan tupel sebagai argumen.

Itu jelas sintaks yang buruk (literal tidak mengambil argumen kata kunci). Dalam Python 3.x printadalah fungsi sebenarnya, jadi dibutuhkan argumen kata kunci juga.

Idiom yang benar dalam Python 2.x end=" "adalah:

print "foo" % bar,

(perhatikan koma terakhir, ini membuatnya mengakhiri baris dengan spasi, bukan pemisah baris)

Jika Anda ingin lebih mengontrol output, pertimbangkan untuk menggunakan sys.stdoutsecara langsung. Ini tidak akan melakukan keajaiban khusus dengan hasilnya.

Tentu saja dalam versi Python 2.x yang agak baru (seharusnya 2.5 memilikinya, tidak yakin tentang 2.4), Anda dapat menggunakan __future__modul untuk mengaktifkannya di file skrip Anda:

from __future__ import print_function

Hal yang sama berlaku dengan unicode_literalsdan beberapa hal baik lainnya ( with_statement, misalnya). Ini tidak akan berfungsi di versi yang benar-benar lama (yaitu dibuat sebelum fitur diperkenalkan) dari Python 2.x.

Alan Plum
sumber
1
Saya memeriksa versi saya menggunakan dpkg -p pythondan itu versi 2.xx.xx. Terima kasih banyak, saya menerapkan saran untuk menaruhnya dalam bentuk print "foo" %bar, dan itu bekerja dengan baik.
Mehrad
Perlu diingat, ada perbedaan (halus) antara print foo, bardan print (foo, bar)di Python 2. Yang pertama adalah printpernyataan dengan dua item dalam daftar "argumen"; yang terakhir adalah printpernyataan dengan satu tupel dalam daftar argumennya.
chepner
Contoh Anda print("foo" % bar, end=" ")tidak akan berhasil, karena bartidak ditentukan; jadi apa barcontoh Anda? (Setidaknya bagi saya dengan Python 3.7)
Qaswed
50

Bagaimana dengan ini:

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

Ini memungkinkan Anda untuk menggunakan printfungsi gaya Python 3.0 tanpa harus mengedit sendiri semua kejadian print:)

badp
sumber
17

Di python 2.7 inilah cara Anda melakukannya

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

Dalam python 3.x

myjob= 'hacker'
for c in myjob: print (c, end=' ')
#output 
h a c k e r 
Ritesh Karwa
sumber
5
Sobat, kamu baru saja menyelesaikan masalah yang membuatku bingung selama beberapa hari, aku hanya ingat peluit dan adegan masa lalu itu tetapi bukan lyris, dan sekarang akhirnya aku mencari tahu lagu apa itu !!
Sphynx-HenryAY
@ Sphynx-HenryAY dengan senang hati membantu Anda saudara
Ritesh Karwa
Pada contoh kedua Anda, tampaknya h a c k e r ada spasi di antara karakter. Saya menggunakan Python 3.7.3 dan saya tidak mendapatkan spasi sama sekali end=''.
Nagev
@Nagev hanya memberi spasi antara '' end = ''
Ritesh Karwa
Terima kasih, saya tidak ingin spasi, hanya saja saya berpikir bahwa saya melihat kode Anda tanpa spasi namun keluarannya berjarak, yang sepertinya tidak konsisten, itu saja.
Nagev
5

Pertama-tama, Anda kehilangan kutipan di awal tetapi ini mungkin kesalahan salin / tempel.

Dalam Python 3.x, end=' 'bagian tersebut akan menempatkan spasi setelah string yang ditampilkan, bukan baris baru. Untuk melakukan hal yang sama dengan Python 2.x, Anda akan meletakkan koma di akhir:

print "Building internam Index for %d tile(s) ..." % len(inputTiles),
interjay
sumber
Saya tertarik untuk melakukan sesuatu seperti ini di python 2 apa yang akan menjadi sintaksnya? apa maksudmu menambahkan koma?
Rémi
1
@ Rémi Kode dalam jawaban saya adalah dengan Python 2 ... Dan saya mengacu pada koma di bagian akhir.
interjay
4

Saya pikir dia menggunakan Python 3.0 dan Anda menggunakan Python 2.6.

Charles Beattie
sumber
1
Poin bagus! print("foo" % bar, end = " ")memicu kesalahan sintaks di Python 2.6 di bawah end = " "seperti kutipan yang hilang tidak :)
badp
3

Ini hanya masalah versi. Karena Python 3.x cetakan sebenarnya adalah sebuah fungsi, jadi sekarang dibutuhkan argumen seperti fungsi normal lainnya.

Ini end=' 'hanya untuk mengatakan bahwa Anda menginginkan spasi setelah akhir pernyataan, bukan karakter baris baru. Dalam Python 2.x Anda harus melakukan ini dengan menempatkan koma di akhir pernyataan cetak.

Misalnya, saat berada di lingkungan Python 3.x:

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

Akan memberikan hasil sebagai berikut:

0
1
2
3
4

Dimana sebagai:

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

Akan diberikan sebagai output:

0 1 2 3 4
kdperspective
sumber
Tautan ke dokumentasi resmi print()mungkin berguna, karena di sana seseorang dapat melihat nilai default '\n'untuk argumen end: docs.python.org/3/library/functions.html#print
Qaswed
Jangan lupa spasi pada akhirnya seperti contoh di atas: "hacker" output di sini harus "0 1 2 3 4" dengan spasi terakhir yang sesuai
alant
2

Sepertinya Anda baru saja melewatkan tanda kutip ganda pembuka. Mencoba:

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

Saya pikir penulis mungkin bermaksud:

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

Dia kehilangan kutipan awal setelahnya print(.

Perhatikan bahwa pada Python 3.0 , printfungsinya berlawanan dengan pernyataan, jika Anda menggunakan versi Python yang lebih lama, padanannya adalah:

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

The endparameter berarti bahwa garis mendapat ' 'di akhir daripada karakter baris baru. Yang setara di versi Python sebelumnya adalah:

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

(terima kasih Ignacio).

Dominic Rodger
sumber
1
Menambahkan a ,di akhir akan berhasil.
Ignacio Vazquez-Abrams
1

GUNAKAN :: python3 filename.py

Saya mengalami kesalahan seperti itu, ini terjadi karena saya menginstal dua versi python pada drive saya yaitu python2.7 dan python3. Berikut adalah kode saya:

#!usr/bin/python

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

ketika saya menjalankannya dengan perintah python lines.pysaya mendapat kesalahan berikut

#!usr/bin/python

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

ketika saya menjalankannya dengan perintah yang python3 lines.pysaya jalankan dengan sukses

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

Untuk python 2.7 Saya memiliki masalah yang sama Cukup gunakan " dari __future__ import print_function " tanpa tanda kutip untuk mengatasi masalah ini. Ini Memastikan Python 2.6 dan yang lebih baru Python 2.x dapat menggunakan fungsi cetak Python 3.x.

Viraj Patil
sumber
1

Coba yang ini jika Anda bekerja dengan python 2.7:

from __future__ import print_function
scofield
sumber
Selamat datang di StackOverflow: jika Anda mengeposkan kode, XML atau contoh data, harap sorot baris tersebut di editor teks dan klik tombol "contoh kode" ({}) pada bilah alat editor atau gunakan Ctrl + K pada keyboard Anda untuk memformat dengan baik dan sorot sintaks!
WhatsThePoint
0

Bahkan saya mendapatkan kesalahan yang sama hari ini. Dan saya telah mengalami hal yang menarik. Jika Anda menggunakan python 3.x dan masih mendapatkan kesalahan, itu mungkin alasannya:

Anda memiliki beberapa versi python yang diinstal pada drive yang sama. Dan ketika Anda menekan tombol f5, jendela shell python (dari ver. <3.x) akan muncul

Saya mendapatkan kesalahan yang sama hari ini, dan memperhatikan hal itu. Percayalah, ketika saya mengeksekusi kode saya dari jendela shell yang tepat (versi 3.x), saya mendapat hasil yang memuaskan

Biswajit Paul
sumber
0

kita perlu mengimpor header sebelum menggunakan end='', karena tidak termasuk dalam runtime normal python.

from __future__ import print_function

itu akan bekerja dengan sempurna sekarang

sukantk
sumber
0

Kompatibel dengan kedua Python 2 & 3 :

sys.stdout.write('mytext')

Kompatibel hanya dengan Python 2

print 'mytext',

Kompatibel hanya dengan Python 3

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