পাইথন 3 এ স্টাডাউটে বাইনারি ডেটা কীভাবে লিখবেন?


103

পাইথন ২.x এ আমি এটি করতে পারি:

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

এখন যাইহোক, আমি একটি পেতে TypeError: can't write bytes to text stream। এমন কিছু গোপন এনকোডিং রয়েছে যা আমার ব্যবহার করা উচিত?


4
এটা অনেক ভাল হবে একটি উত্তর যে পাইথন 2.6+ এবং 3.x সঙ্গে কাজ করবে এটি
sorin

2
os.writeপাই 2 এবং পাই 3 উভয়টিতেই কাজ করবে।
ডেভিড ওলবার

উত্তর:


169

একটি ভাল উপায়:

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

4
ব্যবহার sys.stdout.bufferএছাড়াও আপনি ব্যবহার মত কাজগুলি করতে দেয় shutil.copyfileobjএমনকি যখন সোর্স ফাইল বস্তুর বাইট দেয়, এবং না স্ট্রিং। +1
সিএসএল

1
এটি ব্যবহার করে প্রোগ্রামগুলিকে AttributeError: 'PseudoOutputFile' object has no attribute 'buffer'
আইডিএল

4
আইডলিতে @ ডামিয়ানইয়ারিক (কমপক্ষে উইন্ডোজে) আইডিএল pythonw.exeচালায়, যার অর্থ কোনও স্টাডাউট নেই। এটি টিনেটার দিয়ে অনুকরণ করা হয়। এটি শারীরিকভাবে বাইটগুলি পরিচালনা করতে পারে না। এই ক্ষেত্রে, .decode('UTF-8', errors='replace')আপনার স্ট্রিং, বা python3 -I <filename>IDLE ব্যবহার না করে একটি REPL পেতে চালান ।
আর্টিয়ার

লিখেছেন ক্রম টা বাজিয়েছে যখন লিখিতভাবে stderrযদি বরাবর ব্যবহার print(file=sys.stderr)
কোটাউস্কাস

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

বা, os.write(sys.stdout.fileno(), …)যদি এটি আপনার চেয়ে বেশি পাঠযোগ্য 1


ধন্যবাদ, যে কাজ করেছে। কিছুটা হ্যাক-ইশ অনুভব করে তবে আমার ধারণা এটি করা সাধারণ জিনিস নয়।
ইভান বাল্ডিন

6
সমস্যাটি os.writeহ'ল আপনাকে রিটার্নের মানটি পরীক্ষা করতে হবে, কারণ এটি লিখিতভাবে গ্যারান্টি দেয় না যে সবকিছু লেখা হবে।
mic_e

10

এটি করার একটি অদ্ভুত উপায় যা কেবল পাইথন 3 এর জন্য উপলব্ধ is

with os.fdopen(sys.stdout.fileno(), "wb", closefd=False) as stdout:
    stdout.write(b"my bytes object")
    stdout.flush()

ভাল অংশটি হ'ল এটি সাধারণ ফাইল অবজেক্ট ইন্টারফেস ব্যবহার করে, যা পাইথনে প্রত্যেকে অভ্যস্ত।

লক্ষ্য করুন যে আমি ব্লকটি থেকে বেরিয়ে যাওয়ার সময় closefd=Falseবন্ধ হওয়া এড়াতে সেট করছি । অন্যথায়, আপনার প্রোগ্রাম আর stdout মুদ্রণ করতে সক্ষম হবে না। তবে অন্য ধরণের ফাইল বর্ণনাকারীদের জন্য আপনি সেই অংশটি এড়িয়ে যেতে পারেন।sys.stdoutwith


তুই ফ্লাশ করিস কেন? পাইথনকে সিদ্ধান্ত নিতে দেওয়া ভাল নয় যে স্টডআউট কখন প্রবাহিত হবে?
মার্টিন

0

আপনি যদি পাইথন 3 এ একটি এনকোডিং নির্দিষ্ট করতে চান তবে আপনি নীচের মতো বাইটস কমান্ডটি ব্যবহার করতে পারেন:

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

যেখানে 1 হল স্টাডাউট -> sys.stdout.fileno () এর সাথে সম্পর্কিত স্বাভাবিক নম্বর

অন্যথায় যদি আপনি এনকোডিংয়ের যত্ন না করেন তবে কেবল ব্যবহার করুন:

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

আপনি যদি এনকোডিং ছাড়াই os.writ ব্যবহার করতে চান তবে নীচেরটি ব্যবহার করার চেষ্টা করুন:

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

1
ব্যবহারযোগ্য প্রোগ্রামগুলি os.write(sys.stdout.fileno(), some_bytes)আইডলিতে কাজ করবে না। io.UnsupportedOperation: fileno
দামিয়ান ইয়ারিক

@ ড্যামিয়ানইয়ারিক: আপনি ঠিক বলেছেন ... আইডিএল এর মতো কিছু পরীক্ষা করার জন্য কোনওভাবেই ব্যবহার করা উচিত নয়। শীঘ্রই: আইডিএলটি খোলার চেষ্টা করুন (আমার কাছে পাইথন 3.5.1 শেল ছিল) এবং কেবলমাত্র সিস এবং সিএসডটআউট.ফিলানো আমদানি করুন () এটি আপনাকে আইও ত্রুটি ছুঁড়ে দেবে, কারণ আইডলিতে এটি অপারেশন সমর্থন করে না :-) এটি সর্বদা গুরুত্বপূর্ণ আপনি কোন পরিবেশে কাজ করছেন তা মনে রাখার জন্য এবং কী কী সম্ভব তার চেষ্টা করার চেষ্টা করুন;) আশা করি এটি আপনার প্রশ্নের উত্তরটি পরিষ্কার করে :-) একটি সুন্দর উইকএন্ডে দিন কাটাবেন।
মার্কো smdm

আপনি কেবল আসল বাইনারি ডেটা লেখার একটি উপায় উল্লেখ করেছেন stdout, শেষটি।
কোটাউস্কাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.