अजगर 3 में stdout करने के लिए बाइनरी डेटा कैसे लिखें?


103

अजगर 2.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 के साथ काम करेगा
— सोरिन

2
os.writePy2 और Py3 दोनों पर काम करेगा।
— डेविड वोलेवर

जवाबों:


169

एक बेहतर तरीका:

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

4
उपयोग sys.stdout.bufferकरने से आप shutil.copyfileobjस्रोत फ़ाइल ऑब्जेक्ट बाइट्स और स्ट्रिंग्स न होने पर भी उपयोग करने जैसी चीजें कर सकते हैं। +1
— csl

1
इसका उपयोग करने वाले कार्यक्रमों को AttributeError: 'PseudoOutputFile' object has no attribute 'buffer'
— आईडीएल

4
आईडीएल में @DamianYerrick (विंडोज में कम से कम) आईडीएलई pythonw.exeचलाती है, जिसका मतलब है कि कोई स्टडआउट नहीं है। यह टिक्कटर के साथ उत्सर्जित होता है। यह शारीरिक रूप से बाइट्स को संभाल नहीं सकता है। इस स्थिति में, .decode('UTF-8', errors='replace')आपका स्ट्रिंग, या python3 -I <filename>IDLE का उपयोग करने के बजाय एक REPL प्राप्त करने के लिए चलाएँ ।
— एरियर

लिखने का क्रम बनाता है जब लिखने stderrके साथ उपयोग करने के लिए print(file=sys.stderr)।
— Kotauskas

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

या, os.write(sys.stdout.fileno(), …)यदि वह 1आपके लिए अधिक पठनीय है ।


धन्यवाद, यह काम किया। थोड़ा हैक-ईश लगता है, लेकिन मुझे लगता है कि ऐसा करना आम बात नहीं है।
— इवान बाल्डिन

6
इसके साथ समस्या os.writeयह है कि आपको रिटर्न मान की जांच करनी होगी, क्योंकि यह गारंटी नहीं देता है कि सब कुछ लिखा जाएगा।
— 18

10

ऐसा करने का एक मुहावरेदार तरीका, जो केवल पायथन 3 के लिए उपलब्ध है:

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

अच्छी बात यह है कि यह सामान्य फ़ाइल ऑब्जेक्ट इंटरफ़ेस का उपयोग करता है, जिसका उपयोग हर कोई पायथन में करता है।

ध्यान दें कि मैं ब्लॉक से बाहर निकलने पर closefd=Falseबंद sys.stdoutहोने से बचने के लिए सेटिंग कर रहा हूं with। अन्यथा, आपका कार्यक्रम अब और प्रिंटआउट करने में सक्षम नहीं होगा। हालाँकि, अन्य प्रकार के फ़ाइल डिस्क्रिप्टर के लिए, आप उस हिस्से को छोड़ना चाह सकते हैं।


तुम क्यों बहते हो? यह बेहतर नहीं है कि पायथन को फैसला करना है कि स्टडआउट को कब फ्लश किया जाए?
— मार्टिन 10

0

यदि आप python3 में एन्कोडिंग निर्दिष्ट करना चाहते हैं, तो आप नीचे दिए गए बाइट्स कमांड का उपयोग कर सकते हैं:

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.write का उपयोग करना चाहते हैं, तो नीचे का उपयोग करने का प्रयास करें:

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

1
उपयोग करने वाले प्रोग्राम os.write(sys.stdout.fileno(), some_bytes)IDLE में काम नहीं करेंगे। io.UnsupportedOperation: fileno
— डेमियन यरिक 12

@DamianYerrick: आप सही कह रहे हैं ... IDLE का उपयोग वैसे भी परीक्षण करने के लिए नहीं किया जाना चाहिए। शीघ्रता से: IDLE खोलने का प्रयास करें (मेरे पास python3.5.1 शेल था) और बस sys और sys.stdout.fileno आयात करें () यह आपको io त्रुटि फेंक देगा, क्योंकि IDLE में यह समर्थित नहीं है :-): यह हमेशा महत्वपूर्ण है याद रखें कि आप किस माहौल में काम कर रहे हैं और जो संभव है उसे पाने की कोशिश करें;) आशा है कि यह आपके प्रश्न को स्पष्ट करेगा :-) एक अच्छा सप्ताहांत है।
— मार्को स्मैम

आप केवल stdoutअंतिम द्विआधारी डेटा को लिखने का एक तरीका बताते हैं ।
— Kotauskas
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.