2012-03-05 35 views
6

Tôi đã contered mã Python 2 đến Python 3. Khi làm như vậy, tôi đã thay đổipython 3: làm thế nào để làm cho dải() làm việc cho byte

print 'String: ' + somestring 

vào

print(b'String: '+somestring) 

vì tôi gặp phải lỗi sau:

Can't convert 'bytes' object to str implicitly 

Nhưng bây giờ tôi không thể triển khai các thuộc tính chuỗi như strip(), nguyên nhân họ không còn được coi là chuỗi ...

global name 'strip' is not defined 

cho

if strip(somestring)=="":  

Làm thế nào tôi nên giải quyết tình trạng khó xử này giữa chuyển đổi chuỗi byte và có thể sử dụng thuộc tính chuỗi? Có cách giải quyết nào không? Xin hãy giúp tôi ra ngoài và cảm ơn bạn trước ..

+0

xin lỗi nó thực sự không phải là một chuỗi rỗng tôi cố định nó – CosmicRabbitMediaInc

+0

vì vậy nó sẽ làm việc với byte? Tôi giả sử sử dụng nó một cách độc lập không được hỗ trợ trong python 3? Làm thế nào tôi nên sửa chữa nó tương đương? – CosmicRabbitMediaInc

+1

Không có nội trang 'strip()' trong Python 2. – geoffspear

Trả lời

8

Có hai vấn đề ở đây, một trong số đó là vấn đề thực sự, vấn đề còn lại khiến bạn khó hiểu, nhưng không phải là vấn đề thực tế. Trước tiên:

Chuỗi của bạn là đối tượng byte, tức là một chuỗi byte 8 bit. Python 3 xử lý điều này khác với văn bản, đó là Unicode. Bạn lấy chuỗi từ đâu? Vì bạn muốn coi nó như là văn bản, có lẽ bạn nên chuyển nó thành một đối tượng str, được sử dụng để xử lý văn bản. Điều này thường được thực hiện với sự .decode function(), ví dụ:

somestring.decode('UTF-8') 

Mặc dù gọi str() cũng hoạt động:

str(somestring, 'UTF8') 

(Lưu ý rằng giải mã của bạn có thể là cái gì khác hơn UTF8)

Tuy nhiên, đây không phải là câu hỏi thực tế của bạn. Câu hỏi thực tế của bạn là cách tách chuỗi byte. Và asnwer là bạn làm điều đó theo cùng một cách như bạn chuỗi một text-chuỗi:

somestring.strip() 

Không có dải() được xây dựng trong trong hoặc Python 2 hoặc Python 3. Có một dải chức năng trong chuỗi mô-đun trong Python 2:

from string import strip 

Nhưng thực tế không tốt khi sử dụng vì chuỗi có phương thức strip(), giống như 10 năm hoặc lâu hơn. Vì vậy, trong Python 3 nó đã biến mất.

+3

Lưu ý rằng khi bạn chuyển đối số sang 'strip' (hoặc' rstrip' hoặc 'lstrip'), kiểu đối số cần phải khớp với kiểu đối tượng. Tức là, khi bạn gọi 'strip' trên một đối tượng' bytes', đối số không thể là một chuỗi. Điều này vấp ngã tôi khi tôi gọi 's.rstrip ('\ 0')' để loại bỏ các ký tự null sau. Tôi cần thay đổi nó thành 's.rstrip (b '\ 0')' vì 's' là một đối tượng' byte', không phải là 'str'. –

2

Tôi tin rằng bạn có thể sử dụng "str" ​​chức năng để bỏ nó vào một chuỗi

print str(somestring).strip() 

hoặc có thể

print str(somestring, "utf-8").strip() 
+1

Không có phép đúc trong Python - bạn nhận được một đối tượng mới, khác biệt. –

+0

true, str (object) trả về một chuỗi. nó thực sự là một đối tượng chuỗi mới. – Developer

+0

Tùy chọn thứ hai làm việc cho tôi cảm ơn! – EminezArtus

1
>>> b'foo '.strip() 
b'foo' 

Hoạt động tốt.

Nếu nội dung bạn đang xử lý là văn bản, bạn có thể chỉ cần có đối tượng str thực tế, không phải đối tượng bytes.

Các vấn đề liên quan