python print end = ''


115

Tôi có tập lệnh python này mà tôi cần chạy gdal_retile.py

nhưng tôi nhận được một ngoại lệ trên dòng này:

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

Các end=''là cú pháp hợp lệ. Tôi tò mò không biết tại sao, và tác giả có lẽ muốn làm gì.

Tôi mới làm quen với python nếu bạn chưa đoán ra.


Tôi nghĩ nguyên nhân sâu xa của vấn đề là những lần nhập khẩu này không thành công và do đó người ta phải ngăn chặn việc nhập khẩu này 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
Nó thực sự hữu ích nếu bạn đăng bản truy xuất để chẩn đoán tốt nhất trường hợp ngoại lệ mà bạn nhận được. Lỗi cú pháp rõ ràng là do thiếu dấu ngoặc kép. Nếu điều đó đã được khắc phục, nó vẫn sẽ là một lỗi cú pháp trong Python 2, không có chức năng in mà không cần __future__nhập.
Mike Graham

2
Ngoài ra, các biến không được ClassNamesbắt đầu bằng chữ thường.
Mike Graham

wrt / @Mike, xem python.org/dev/peps/pep-0008 để biết hướng dẫn đầy đủ về cách đặt tên biến và kiểu mã hóa trong Python. Bạn nên tuân thủ các nguyên tắc vì trong Python, bạn có đặc quyền làm việc với một thư viện nhất quán và do đó thường có thể tránh trò chơi đoán thông thường (ví dụ: PHP) ngay cả khi bạn đang làm việc với mã của người khác.
Alan Plum

5
Khi yêu cầu trợ giúp về các lỗi trong tương lai, đặc biệt là lỗi cú pháp , bạn nên cố gắng cung cấp mã chính xác mà bạn đã thử chạy mà không cần nhập lại.
Mike Graham

@Mike - Tôi thường sẽ không bao giờ bận tâm khi gõ lại, tuy nhiên tôi không thể làm như vậy vì mã trên một máy tính từ xa. Tôi chắc chắn sẽ cẩn thận hơn trong tương lai.
Hath

Câu trả lời:


155

Bạn có chắc mình đang sử dụng Python 3.x không? Cú pháp không khả dụng trong Python 2.x vì printvẫn là một câu lệnh.

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

trong Python 2.x giống hệt với

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

hoặc là

print "foo" % bar, end=" "

tức là như một lời gọi để in với một tuple làm đối số.

Đó rõ ràng là cú pháp xấu (các chữ không lấy đối số từ khóa). Trong Python, 3.x printlà một hàm thực tế, vì vậy nó cũng cần các đối số từ khóa.

Thành ngữ đúng trong Python 2.x cho end=" "là:

print "foo" % bar,

(lưu ý dấu phẩy cuối cùng, điều này làm cho nó kết thúc dòng bằng dấu cách chứ không phải dấu ngắt dòng)

Nếu bạn muốn kiểm soát nhiều hơn đầu ra, hãy xem xét sử dụng sys.stdouttrực tiếp. Điều này sẽ không thực hiện bất kỳ phép thuật đặc biệt nào với đầu ra.

Tất nhiên trong các phiên bản gần đây của Python 2.x (2.5 nên có, không chắc chắn về 2.4), bạn có thể sử dụng __future__mô-đun để kích hoạt nó trong tệp script của mình:

from __future__ import print_function

Điều tương tự cũng xảy ra với unicode_literalsvà một số điều tốt đẹp khác ( with_statementví dụ). Tuy nhiên, điều này sẽ không hoạt động trong các phiên bản thực sự cũ (tức là được tạo trước khi tính năng này được giới thiệu) của Python 2.x.


1
Tôi đã kiểm tra phiên bản của mình bằng cách sử dụng dpkg -p pythonvà nó là phiên bản 2.xx.xx. Cảm ơn bạn rất nhiều, tôi đã áp dụng gợi ý để đặt nó ở dạng print "foo" %bar, và nó hoạt động hoàn toàn tốt.
Mehrad

Hãy nhớ rằng có một sự khác biệt (nhỏ) giữa print foo, barprint (foo, bar)trong Python 2. Câu lệnh trước là một printcâu lệnh có hai mục trong danh sách "đối số" của nó; sau đó là một printcâu lệnh có một bộ giá trị trong danh sách đối số của nó.
chepner

Ví dụ của bạn print("foo" % bar, end=" ")sẽ không hoạt động, vì barkhông được xác định; vậy barví dụ của bạn là gì? (Ít nhất là đối với tôi với Python 3.7)
Hỏi

50

Còn cái này thì sao:

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

Điều này cho phép bạn sử dụng printhàm kiểu Python 3.0 mà không cần phải chỉnh sửa thủ công tất cả các lần xuất hiện của print:)


17

Trong python 2.7, đây là cách bạn làm điều đó

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

Trong python 3.x

myjob= 'hacker'
for c in myjob: print (c, end=' ')
#output 
h a c k e r 

5
Trời ạ, bạn vừa giải quyết một vấn đề khiến tôi bối rối trong vài ngày, tôi chỉ nhớ về tiếng còi và cảnh ngày xưa đó chứ không phải lyris, và bây giờ cuối cùng tôi đã tìm ra bài hát đó là gì !!
Sphynx-HenryAY

@ Sphynx-HenryAY rất vui khi được giúp đỡ anh trai
Ritesh Karwa

Trong ví dụ thứ hai của bạn, nó xuất hiện h a c k e r có khoảng trắng ở giữa các ký tự. Tôi đang sử dụng Python 3.7.3 và tôi không nhận được khoảng trắng nào cả end=''.
Nagev

@Nagev chỉ cần đặt một không gian giữa '' đến cuối =''
Ritesh Karwa

Cảm ơn, tôi không muốn khoảng trắng, chỉ là tôi nghĩ rằng tôi thấy mã của bạn không có khoảng trắng nhưng đầu ra lại có khoảng cách, có vẻ không nhất quán, vậy thôi.
Nagev

5

Trước hết, bạn đang thiếu một trích dẫn ở đầu nhưng đây có thể là lỗi sao chép / dán.

Trong Python 3.x, end=' 'phần sẽ đặt một khoảng trắng sau chuỗi được hiển thị thay vì một dòng mới. Để làm điều tương tự trong Python 2.x, bạn phải đặt dấu phẩy ở cuối:

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

Tôi được giao để làm điều gì đó như thế này trong python 2, cú pháp sẽ như thế nào? ý bạn là gì thêm dấu phẩy?
Rémi

1
@ Rémi Mã trong câu trả lời của tôi là bằng Python 2 ... Và tôi đang đề cập đến dấu phẩy ở cuối.
interjay

4

Tôi nghĩ anh ấy đang sử dụng Python 3.0 và bạn đang sử dụng Python 2.6.


1
Điểm tốt! print("foo" % bar, end = " ")gây ra lỗi cú pháp trong Python 2.6 end = " "giống như câu trích dẫn bị thiếu :)
badp

3

Đây chỉ là một điều phiên bản. Vì Python 3.x print thực sự là một hàm, vì vậy nó bây giờ nhận các đối số giống như bất kỳ hàm bình thường nào.

Điều end=' 'này chỉ để nói rằng bạn muốn một khoảng trắng sau cuối câu lệnh thay vì một ký tự dòng mới. Trong Python 2.x, bạn sẽ phải thực hiện việc này bằng cách đặt dấu phẩy vào cuối câu lệnh in.

Ví dụ: khi ở trong môi trường Python 3.x:

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

Sẽ cho kết quả sau:

0
1
2
3
4

Trong khi:

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

Sẽ cung cấp dưới dạng đầu ra:

0 1 2 3 4

Một liên kết đến tài liệu chính thức của print()có thể hữu ích, vì ở đó người ta có thể thấy giá trị mặc định'\n' cho tham số end: docs.python.org/3/library/functions.html#print
Qaswed

Đừng quên một dấu cách ở cuối như ví dụ ở trên: "hacker" đầu ra ở đây phải là "0 1 2 3 4" với một dấu cách cuối cùng tương ứng
alant 26/07/19

2

Có vẻ như bạn chỉ thiếu một dấu ngoặc kép mở đầu. Thử:

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

1

Tôi nghĩ tác giả có lẽ muốn nói:

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

Anh ấy thiếu một trích dẫn đầu tiên sau khi print(.

Lưu ý rằng kể từ Python 3.0 ,print là một hàm trái ngược với một câu lệnh, nếu bạn đang sử dụng các phiên bản cũ hơn của Python, hàm tương đương sẽ là:

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

Các endtham số phương tiện mà dòng được' ' vào cuối chứ không phải là một ký tự xuống dòng. Tương tự trong các phiên bản Python trước là:

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

(cảm ơn Ignacio).


1
Thêm một ,vào cuối sẽ làm được.
Ignacio Vazquez-Abrams

1

SỬ DỤNG :: python3 filename.py

Tôi đã gặp lỗi như vậy, điều này xảy ra vì tôi có hai phiên bản python được cài đặt trên ổ đĩa của mình là python2.7 và python3. Sau đây là mã của tôi:

#!usr/bin/python

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

khi tôi chạy nó bằng lệnh, python lines.pytôi gặp lỗi sau

#!usr/bin/python

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

khi tôi chạy nó bằng lệnh python3 lines.pytôi đã thực hiện thành công


3
#! / usr / bin / env python3
Mingliang Liu

1

Đối với python 2.7, tôi đã gặp vấn đề tương tự Chỉ cần sử dụng " from __future__ import print_ functions " mà không có dấu ngoặc kép để giải quyết vấn đề này. Điều này đảm bảo Python 2.6 và Python 2.x mới hơn có thể sử dụng hàm in Python 3.x.


1

Hãy thử cái này nếu bạn đang làm việc với python 2.7:

from __future__ import print_function

Chào mừng bạn đến với StackOverflow: nếu bạn đăng mẫu mã, XML hoặc dữ liệu, vui lòng đánh dấu các dòng đó trong trình chỉnh sửa văn bản và nhấp vào nút "mẫu mã" ({}) trên thanh công cụ của trình chỉnh sửa hoặc sử dụng Ctrl + K trên bàn phím của bạn để định dạng độc đáo và cú pháp làm nổi bật nó!
WhatsThePoint

0

Ngay cả hôm nay tôi cũng gặp lỗi tương tự. Và tôi đã trải qua một điều thú vị. Nếu bạn đang sử dụng python 3.x và vẫn gặp lỗi, đó có thể là một lý do:

Bạn đã cài đặt nhiều phiên bản python trên cùng một ổ đĩa. Và khi bạn đặt trước nút f5, cửa sổ python shell (của phiên bản <3.x) sẽ bật lên

Tôi đã gặp lỗi tương tự ngày hôm nay và nhận thấy điều đó. Hãy tin tưởng tôi, khi tôi thực thi mã của mình từ cửa sổ shell thích hợp (của phiên bản 3.x), tôi đã nhận được kết quả hài lòng


0

chúng ta cần nhập một tiêu đề trước khi sử dụng end='', vì nó không được bao gồm trong thời gian chạy bình thường của python.

from __future__ import print_function

nó sẽ hoạt động hoàn hảo ngay bây giờ


0

Tương thích với cả Python 2 & 3 :

sys.stdout.write('mytext')

Chỉ tương thích với Python 2

print 'mytext',

Chỉ tương thích với Python 3

print('mytext', end='')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.