2009-05-25 33 views
53

Trong python 2.x tôi có thể làm điều này:Làm thế nào để ghi dữ liệu nhị phân trong stdout trong python 3?

import sys, array 
a = array.array('B', range(100)) 
a.tofile(sys.stdout)

Bây giờ tuy nhiên, tôi nhận được một TypeError: can't write bytes to text stream. Có một số mã hóa bí mật mà tôi nên sử dụng?

+3

Sẽ tốt hơn nhiều để tìm một câu trả lời rằng sẽ làm việc với Python 2.6+ và 3. x – sorin

+1

'os.write' sẽ hoạt động trên cả Py2 và Py3. –

Trả lời

90

Cách tốt hơn:

import sys 
sys.stdout.buffer.write(b"some binary data") 
+3

Sử dụng 'sys.stdout.buffer' cũng cho phép bạn làm những việc như sử dụng' shutil.copyfileobj' ngay cả khi đối tượng tệp nguồn cung cấp byte và không phải là chuỗi. +1 – csl

+0

Các chương trình sử dụng này không thể được kiểm tra trong IDLE 3: đối tượng 'AttributeError: 'PseudoOutputFile' không có thuộc tính 'buffer'' –

+0

@DamianYerrick trong IDLE (trong Windows ít nhất)' pythonw.exe' chạy IDLE, có nghĩa là rằng không có stdout. Nó được mô phỏng với tkinter. Nó thể chất không thể xử lý byte. Trong trường hợp này, '.decode ('UTF-8', errors = 'replace')' chuỗi của bạn, hoặc chạy 'python3 -I ' để nhận được REPL thay vì sử dụng IDLE. – Artyer

10
import os 
os.write(1, a.tostring()) 

hoặc, os.write(sys.stdout.fileno(), …) nếu điều đó dễ đọc hơn 1 cho bạn.

+0

Cảm ơn, điều đó đã hiệu quả. Cảm thấy một chút hack-ish nhưng tôi đoán nó không phải là điều phổ biến để làm. –

+4

Vấn đề với 'os.write' là bạn sẽ phải kiểm tra giá trị trả về, vì nó không đảm bảo rằng mọi thứ sẽ được viết. –

0

Trong trường hợp bạn muốn chỉ định một mã hóa trong python3 bạn vẫn có thể sử dụng các byte lệnh như dưới đây:

import os 
os.write(1,bytes('Your string to Stdout','UTF-8')) 

trong đó 1 là số thông thường tương ứng cho stdout -> sys.stdout.fileno()

Nếu không, bạn không quan tâm đến mã hóa chỉ sử dụng:

import sys 
sys.stdout.write("Your string to Stdout\n") 

Nếu bạn muốn sử dụng os.write mà không cần mã hóa, sau đó cố gắng sử dụng dưới đây:

import os 
os.write(1,b"Your string to Stdout\n") 
+0

Các chương trình sử dụng 'os.write (sys.stdout.fileno(), some_bytes)' sẽ không hoạt động trong IDLE. 'io.UnsupportedOperation: fileno' –

+0

@DamianYerrick: Bạn nói đúng ... IDLE không nên được sử dụng để kiểm tra một cái gì đó như thế. Một thời gian ngắn: cố gắng mở IDLE (tôi đã có vỏ python3.5.1) và chỉ cần nhập sys và sys.stdout.fileno() nó sẽ ném bạn lỗi io, bởi vì trong IDLE này không được hỗ trợ hoạt động :-) Nó luôn luôn quan trọng để ghi nhớ trong đó môi trường bạn đang làm việc và cố gắng để có được những gì có thể;) Hy vọng điều này làm rõ truy vấn của bạn :-) Có một ngày cuối tuần tốt đẹp. –

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