2011-06-25 64 views
49

Có bất kỳ sự thay thế nào cho python StringIO lớp, một lớp sẽ hoạt động với bytes thay vì chuỗi?Thay thế Python StringIO hoạt động với byte thay vì chuỗi?

Có thể không rõ ràng nhưng nếu bạn sử dụng StringIO để xử lý dữ liệu nhị phân, bạn sẽ không may mắn với Python 2.7 hoặc mới hơn.

+1

Không rõ vấn đề của bạn là gì. Vui lòng giải thích vấn đề bị cáo buộc của bạn bằng cách hiển thị mã hoạt động ở 2.6 nhưng không phải là 2.7. Hoặc xem câu trả lời của tôi. –

+0

Tác giả chưa chọn câu trả lời đúng! – heltonbiker

Trả lời

78

Hãy thử io.BytesIO.

othershave chỉ ra, bạn thực sự có thể sử dụng StringIO trong 2.7, nhưng BytesIO là lựa chọn tốt để tương thích về phía trước.

+0

nó có ở đó: http://docs.python.org/release/2.7.2/library/io.html#io.BytesIO – matchew

+0

Có nó hoạt động với Python 3.3 –

7

Trong Python 2.6/2.7, mô-đun io được dự định sẽ được sử dụng để tương thích với Python 3.X. Từ tài liệu:

Mới trong phiên bản 2.6.

Mô-đun io cung cấp giao diện Python để xử lý luồng. Dưới Python 2.x, đây là đề xuất thay thế cho đối tượng được tích hợp sẵn, nhưng trong Python 3.x, giao diện mặc định là để truy cập tệp và luồng .

Note Kể từ module này đã được thiết kế chủ yếu cho Python 3.x, bạn phải lưu ý rằng tất cả các công dụng của “byte” trong tài liệu này đề cập đến các loại str (trong đó byte là một bí danh) , và tất cả việc sử dụng “văn bản” đều tham chiếu đến loại unicode. Hơn nữa, hai loại không thể hoán đổi cho nhau ở các API io .

Trong các phiên bản Python sớm hơn 3.x module StringIO chứa các phiên bản cũ của StringIO, mà không giống như io.StringIO có thể được sử dụng trong pre-2.6 phiên bản của Python:

>>> import StringIO 
>>> s=StringIO.StringIO() 
>>> s.write('hello') 
>>> s.getvalue() 
'hello' 
>>> import io 
>>> s=io.StringIO() 
>>> s.write('hello') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: string argument expected, got 'str' 
>>> s.write(u'hello') 
5L 
>>> s.getvalue() 
u'hello' 
6

Bạn nói: "Có thể không rõ ràng nhưng nếu bạn sử dụng StringIO để xử lý dữ liệu nhị phân, bạn sẽ không may mắn với Python 2.7 hoặc mới hơn ".

Điều này không rõ ràng vì điều đó không đúng.

Nếu bạn có mã hoạt động trên 2.6 trở lên, mã này tiếp tục hoạt động trên 2.7. screen dump chưa được chỉnh sửa (Windows Command prompt gói cửa sổ ở col 80 và tất cả):

C:\Users\John>\python26\python -c"import sys,StringIO;s=StringIO.StringIO();s.wr 
ite('hello\n');print repr(s.getvalue()), sys.version" 
'hello\n' 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)] 

C:\Users\John>\python27\python -c"import sys,StringIO;s=StringIO.StringIO();s.wr 
ite('hello\n');print repr(s.getvalue()), sys.version" 
'hello\n' 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] 

Nếu bạn cần phải viết mã mà chạy trên 2,7 và 3.x, sử dụng lớp BytesIO trong module io.

Nếu bạn cần/muốn một mã đơn lẻ hỗ trợ 2.7, 2.6, ... và 3.x, bạn sẽ cần phải làm việc chăm chỉ hơn một chút. Sử dụng mô-đun six sẽ giúp ích rất nhiều.

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