พิมพ์หลาม 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__การนำเข้า
Mike Graham

2
นอกจากนี้ตัวแปรที่ไม่ClassNamesควรขึ้นต้นด้วยตัวอักษรตัวพิมพ์เล็ก
Mike Graham

wrt / @Mikeโปรดดูpython.org/dev/peps/pep-0008สำหรับแนวทางที่สมบูรณ์สำหรับการตั้งชื่อตัวแปรและรูปแบบการเข้ารหัสใน Python เป็นความคิดที่ดีที่จะปฏิบัติตามหลักเกณฑ์เนื่องจากใน Python คุณมีสิทธิพิเศษในการทำงานกับไลบรารีที่สอดคล้องกันเป็นส่วนใหญ่และมักจะสามารถหลีกเลี่ยงเกมเดาตามปกติ (เช่น PHP) แม้ว่าคุณจะทำงานกับโค้ดของคนอื่นก็ตาม
Alan Plum

5
เมื่อขอความช่วยเหลือเกี่ยวกับข้อผิดพลาดในอนาคตโดยเฉพาะข้อผิดพลาดทางไวยากรณ์คุณควรพยายามระบุรหัสที่คุณได้พยายามเรียกใช้โดยไม่ต้องพิมพ์ใหม่
Mike Graham

@ ไมค์ - โดยปกติแล้วฉันจะไม่ต้องกังวลในการพิมพ์อีกครั้ง แต่ฉันไม่สามารถทำได้เนื่องจากรหัสอยู่บนคอมพิวเตอร์ระยะไกล ฉันจะระมัดระวังให้มากขึ้นในอนาคต
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.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, และทำงานได้ดีอย่างสมบูรณ์
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
ผู้ชายคุณเพิ่งแก้ปัญหาที่ทำให้ฉันสับสนไปสองสามวันฉันจำเสียงนกหวีดและฉากเก่า ๆ ได้ แต่ไม่ใช่เพลง Lyris และในที่สุดฉันก็รู้ว่าเพลงนั้นคืออะไร !!
Sphynx-HenryAY

@ Sphynx-HenryAY ยินดีที่จะช่วยเหลือพี่ชาย
Ritesh Karwa

ในตัวอย่างที่สองของคุณปรากฏว่าh a c k e r มีช่องว่างระหว่างอักขระ ฉันใช้ Python 3.7.3 และไม่มีช่องว่างเลยด้วยend=''.
Nagev

@Nagev เพียงแค่ใส่ช่องว่างระหว่าง '' of end = ''
Ritesh Karwa

ขอบคุณฉันไม่ต้องการที่ว่างฉันคิดว่าฉันเห็นโค้ดของคุณโดยไม่มีช่องว่าง แต่เอาต์พุตยังเว้นระยะห่างซึ่งดูเหมือนไม่สอดคล้องกันนั่นคือทั้งหมด
Nagev

5

ก่อนอื่นคุณไม่มีใบเสนอราคาในตอนต้น แต่อาจเป็นข้อผิดพลาดในการคัดลอก / วาง

ใน Python 3.x end=' 'ส่วนจะวางช่องว่างหลังสตริงที่แสดงแทนการขึ้นบรรทัดใหม่ ในการทำสิ่งเดียวกันใน Python 2.x ให้ใส่เครื่องหมายจุลภาคต่อท้าย:

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

ฉันขอร้องให้ทำอะไรแบบนี้ใน python 2 ไวยากรณ์จะเป็นอย่างไร คุณหมายถึงอะไรเพิ่มลูกน้ำ?
Rémi

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

ลิงก์ไปยังเอกสารอย่างเป็นทางการของprint()อาจมีประโยชน์เนื่องจากสามารถเห็นค่าเริ่มต้น'\n'สำหรับอาร์กิวเมนต์end: docs.python.org/3/library/functions.html#print
Qaswed

อย่าลืมเว้นวรรคท้ายเหมือนตัวอย่างด้านบน: "แฮ็กเกอร์" ผลลัพธ์ที่นี่ควรเป็น "0 1 2 3 4" โดยเว้นวรรคสุดท้ายให้สอดคล้องกัน
ตั้งแต่


1

ฉันคิดว่าผู้เขียนอาจหมายถึง:

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

เขาไม่มีใบเสนอราคาเริ่มต้นหลังจากprint(นั้น

หมายเหตุว่าเป็นของงูหลาม 3.0 , printเป็นฟังก์ชั่นเมื่อเทียบกับคำสั่งถ้าคุณกำลังใช้รุ่นเก่าของงูหลามเทียบเท่าจะเป็น:

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

endพารามิเตอร์หมายความว่าสายที่ได้รับ' 'ในตอนท้ายมากกว่าอักขระ newline สิ่งที่เทียบเท่าใน Python เวอร์ชันก่อนหน้าคือ:

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

(ขอบคุณ Ignacio)


1
การเพิ่ม,ท้ายจะทำได้
Ignacio Vazquez-Abrams

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 shell (ของ ver. <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='')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.