बाइट्स को एक स्ट्रिंग में बदलें


2300

मैं बाहरी प्रोग्राम से मानक आउटपुट प्राप्त करने के लिए इस कोड का उपयोग कर रहा हूं:

>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]

संवाद () विधि बाइट्स की एक सरणी लौटाती है:

>>> command_stdout
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2\n'

हालाँकि, मैं सामान्य पायथन स्ट्रिंग के रूप में आउटपुट के साथ काम करना चाहता हूँ। ताकि मैं इसे इस तरह प्रिंट कर सकूँ:

>>> print(command_stdout)
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2

मैंने सोचा था कि यह Binascii.b2a_qp () विधि के लिए है, लेकिन जब मैंने इसे आज़माया, तो मुझे फिर से वही बाइट सरणी मिली:

>>> binascii.b2a_qp(command_stdout)
b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2\n'

मैं बाइट्स मान को वापस स्ट्रिंग में कैसे बदलूं? मेरा मतलब है, "बैटरी" का उपयोग मैन्युअल रूप से करने के बजाय। और मुझे यह पसंद है कि पायथन 3 के साथ ठीक हो।


46
str(text_bytes)काम क्यों नहीं करता? यह मुझे विचित्र लगता है।
चार्ली पार्कर

12
@CharlieParker str(text_bytes)एन्कोडिंग निर्दिष्ट नहीं कर सकता। Text_bytes में क्या है, इस पर निर्भर करते हुए, text_bytes.decode('cp1250`के परिणामस्वरूप बहुत भिन्न स्ट्रिंग हो सकती है text_bytes.decode('utf-8')
क्रेग एंडरसन

6
इसलिए strफ़ंक्शन वास्तविक स्ट्रिंग में परिवर्तित नहीं होता है। मैं स्पष्ट रूप से किसी कारण से पढ़ने के लिए आलसी हूं, इस कारण से एक एन्कोडिंग कहने के लिए। बस इसे रूपांतरित करें utf-8और देखें कि क्या उर कोड काम करता है। जैसेvar = var.decode('utf-8')
चार्ली पार्कर

@ क्रेगएंडरसन: unicode_text = str(bytestring, character_encoding)पायथन 3 पर अपेक्षित रूप से काम करता है। हालाँकि unicode_text = bytestring.decode(character_encoding), भ्रम से बचने के लिए अधिक बेहतर है str(bytes_obj)कि bytes_objइसे पाठ को डिकोड करने के बजाय एक पाठ प्रतिनिधित्व का उत्पादन करें: str(b'\xb6', 'cp1252') == b'\xb6'.decode('cp1252') == '¶'औरstr(b'\xb6') == "b'\\xb6'" == repr(b'\xb6') != '¶'
5:12

जवाबों:


3671

स्ट्रिंग का उत्पादन करने के लिए आपको बाइट्स ऑब्जेक्ट को डीकोड करना होगा:

>>> b"abcde"
b'abcde'

# utf-8 is used here because it is a very common encoding, but you
# need to use the encoding your data is actually in.
>>> b"abcde".decode("utf-8") 
'abcde'

57
उपयोग करना "windows-1252"विश्वसनीय नहीं है (उदाहरण के लिए, विंडोज के अन्य भाषा संस्करणों के लिए), क्या इसका उपयोग करना सबसे अच्छा नहीं होगा sys.stdout.encoding?
nikow

12
शायद यह आगे किसी की मदद करेगा: कभी-कभी आप पूर्व टीसीपी संचार के लिए बाइट सरणी का उपयोग करते हैं। यदि आप '\ x00' वर्णों को हटाने के लिए बाइट सरणी को स्ट्रिंग कटिंग में बदलना चाहते हैं, तो निम्न उत्तर पर्याप्त नहीं है। B'example \ x00 \ x00'.decode ('utf-8') का उपयोग करें। स्ट्रिप ('\ x00') तब।
वूकी88

2
मैंने Bugs.python.org/issue17860 पर इसे डॉक्यूमेंट करने के बारे में एक बग भरा है - एक पैच प्रपोज़ करने के लिए स्वतंत्र महसूस करें। यदि यह योगदान करना कठिन है - टिप्पणी कि सुधार कैसे किया जाए।
अनातोली टेकटोनिक

44
पायथन में 2.7.6 संभाल नहीं करता है b"\x80\x02\x03".decode("utf-8")-> UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 0: invalid start byte
मार्टिन्यू

9
यदि सामग्री यादृच्छिक बाइनरी मान है, तो utf-8रूपांतरण विफल होने की संभावना है। इसके बजाय @techtonik उत्तर (नीचे) stackoverflow.com/a/27527728/198536 देखें
15:15

214

आपको बाइट स्ट्रिंग को डीकोड करना होगा और इसे कैरेक्टर (यूनिकोड) स्ट्रिंग में बदलना होगा।

अजगर 2 पर

encoding = 'utf-8'
'hello'.decode(encoding)

या

unicode('hello', encoding)

पायथन 3 पर

encoding = 'utf-8'
b'hello'.decode(encoding)

या

str(b'hello', encoding)

2
पायथन 3 पर, यदि स्ट्रिंग एक चर में है तो क्या होगा?
अलाअ एम।

1
@ आलम .: वही। यदि आपके पास है variable = b'hello', तोunicode_text = variable.decode(character_encoding)
5

182

मुझे लगता है कि यह तरीका आसान है:

>>> bytes_data = [112, 52, 52]
>>> "".join(map(chr, bytes_data))
'p44'

6
धन्यवाद, आपकी विधि ने मेरे लिए काम किया जब किसी और ने नहीं किया। मेरे पास एक गैर-एन्कोडेड बाइट सरणी थी जिसकी मुझे जरूरत थी एक स्ट्रिंग में बदल गया। इसे फिर से एनकोड करने का एक तरीका खोजने की कोशिश कर रहा था ताकि मैं इसे एक स्ट्रिंग में डिकोड कर सकूं। यह तरीका पूरी तरह से काम करता है!
leetNightshade

5
@leetNightshade: अभी तक यह बहुत अक्षम है। यदि आपके पास एक बाइट सरणी है, तो आपको केवल डीकोड करना होगा।
मार्टिन पीटर्स

12
@Martijn Pieters मैंने सिर्फ इन दूसरे उत्तरों के साथ एक साधारण बेंचमार्क किया, जिसमें कई 10,000 रन stackoverflow.com/a/3646405/353094 चल रहे थे और उपरोक्त समाधान वास्तव में हर एक बार बहुत तेज था। पायथन 2.7.7 में 10,000 रनों के लिए, यह 8ms, 12ms और 18ms पर दूसरों को लेता है। दी गई है कि इनपुट, पायथन संस्करण आदि के आधार पर कुछ भिन्नता हो सकती है, यह मुझे बहुत धीमा नहीं लगता।
leetNightshade

5
@Martijn पीटर हाँ। तो उस बिंदु के साथ, यह उस प्रश्न के शरीर के लिए सबसे अच्छा जवाब नहीं है जो पूछा गया था। और शीर्षक भ्रामक है, है ना? वह एक बाइट स्ट्रिंग को एक नियमित स्ट्रिंग में बदलना चाहता है, न कि एक बाइट सरणी को एक स्ट्रिंग में। यह उत्तर उस प्रश्न के शीर्षक के लिए ठीक काम करता है जो पूछा गया था।
लेटनाइटशेड

5
अजगर 3 के लिए यह बराबर होना चाहिए bytes([112, 52, 52])- btw बाइट्स एक स्थानीय वैरिएबल के लिए एक बुरा नाम है क्योंकि यह एक पी 3
बिलिन है

91

यदि आप एन्कोडिंग को नहीं जानते हैं, तो पाइथन 3 और पाइथन 2 संगत तरीके से स्ट्रिंग में बाइनरी इनपुट पढ़ने के लिए, प्राचीन MS-DOS CP437 एन्कोडिंग का उपयोग करें:

PY3K = sys.version_info >= (3, 0)

lines = []
for line in stream:
    if not PY3K:
        lines.append(line)
    else:
        lines.append(line.decode('cp437'))

एन्कोडिंग अज्ञात होने के कारण, गैर-अंग्रेजी प्रतीकों से cp437(अंग्रेजी वर्णों का अनुवाद नहीं किया जाता है, क्योंकि वे अधिकांश एकल बाइट एन्कोडिंग और UTF-8 से मेल खाते हैं)।

UTF-8 को मनमाना बाइनरी इनपुट डिकोड करना असुरक्षित है, क्योंकि आपको यह मिल सकता है:

>>> b'\x00\x01\xffsd'.decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 2: invalid
start byte

वही लागू होता है latin-1, जो लोकप्रिय था (डिफ़ॉल्ट?) पायथन के लिए 2. कोडपेज लेआउट में लापता बिंदु देखें - यह वह जगह है जहां पायथन कुख्यात के साथ घुटता है ordinal not in range

अद्यतन 20150604 : ऐसी अफवाहें हैं कि पायथन 3 में surrogateescapeडेटा हानि और क्रैश के बिना बाइनरी डेटा में सामान को एन्कोडिंग के लिए त्रुटि रणनीति है, लेकिन इसे [binary] -> [str] -> [binary]प्रदर्शन और विश्वसनीयता दोनों को मान्य करने के लिए रूपांतरण परीक्षणों की आवश्यकता है ।

अद्यतन 20170116 : नीरो द्वारा टिप्पणी करने के लिए धन्यवाद - त्रुटि बॉलर के साथ सभी अज्ञात बाइट्स से बचने की स्लैश करने की भी संभावना है backslashreplace। यह केवल पायथन 3 के लिए काम करता है, इसलिए इस वर्कअराउंड के साथ भी आपको विभिन्न पायथन संस्करणों से असंगत आउटपुट प्राप्त होगा:

PY3K = sys.version_info >= (3, 0)

lines = []
for line in stream:
    if not PY3K:
        lines.append(line)
    else:
        lines.append(line.decode('utf-8', 'backslashreplace'))

देखें अजगर का यूनिकोड समर्थन जानकारी के लिए।

अद्यतन 20170119 : मैंने पायथन 2 और पायथन 3 के लिए काम करने वाले स्लैश एस्केप डिकोड को लागू करने का निर्णय लिया। यह cp437समाधान की तुलना में धीमा होना चाहिए , लेकिन इसे प्रत्येक पायथन संस्करण पर समान परिणाम उत्पन्न करना चाहिए ।

# --- preparation

import codecs

def slashescape(err):
    """ codecs error handler. err is UnicodeDecode instance. return
    a tuple with a replacement for the unencodable part of the input
    and a position where encoding should continue"""
    #print err, dir(err), err.start, err.end, err.object[:err.start]
    thebyte = err.object[err.start:err.end]
    repl = u'\\x'+hex(ord(thebyte))[2:]
    return (repl, err.end)

codecs.register_error('slashescape', slashescape)

# --- processing

stream = [b'\x80abc']

lines = []
for line in stream:
    lines.append(line.decode('utf-8', 'slashescape'))

6
मैं वास्तव में महसूस करता हूं कि पायथन को लापता प्रतीकों को बदलने और जारी रखने के लिए एक तंत्र प्रदान करना चाहिए।
अनातोली टेकटोनिक

@techtonik: यह python2 में काम करने की तरह एक सरणी पर काम नहीं करेगा।
2322 पर user2284570

@ user2284570 आप सूची का मतलब है? और यह सरणियों पर काम क्यों करना चाहिए? खासतौर पर झांकियों के एरे ..
अनातोली टेकटोनिक

आप, साथ ही साथ यूनिकोड त्रुटियों को अनदेखा कर सकते हैं b'\x00\x01\xffsd'.decode('utf-8', 'ignore')अजगर 3. में
एनतोनिस कालो

3
@anatolytechtonik स्ट्रिंग में भागने के अनुक्रम को छोड़ने और आगे बढ़ने की संभावना है: b'\x80abc'.decode("utf-8", "backslashreplace")इसके परिणामस्वरूप होगा '\\x80abc'। यह जानकारी यूनिकोड प्रलेखन पृष्ठ से ली गई थी जो इस उत्तर के लिखे जाने के बाद से अद्यतन किया गया है।
नीरो

86

पायथन 3 में , डिफ़ॉल्ट एन्कोडिंग है "utf-8", जिससे आप सीधे उपयोग कर सकते हैं:

b'hello'.decode()

जो के बराबर है

b'hello'.decode(encoding="utf-8")

दूसरी ओर, पायथन 2 में , डिफ़ॉल्ट स्ट्रिंग एन्कोडिंग में डिफॉल्ट को एन्कोडिंग करता है। इस प्रकार, आपको उपयोग करना चाहिए:

b'hello'.decode(encoding)

जहाँ encodingआप चाहते हैं एन्कोडिंग है।

नोट: पायथन 2.7 में कीवर्ड तर्कों के लिए समर्थन जोड़ा गया था।


41

मुझे लगता है कि आप वास्तव में यह चाहते हैं:

>>> from subprocess import *
>>> command_stdout = Popen(['ls', '-l'], stdout=PIPE).communicate()[0]
>>> command_text = command_stdout.decode(encoding='windows-1252')

हारून का जवाब सही था, सिवाय इसके कि आपको पता होना चाहिए कि किस एन्कोडिंग का उपयोग करना है। और मेरा मानना ​​है कि विंडोज 'विंडोज़ -1252' का उपयोग करता है। यह केवल तभी मायने रखेगा जब आपकी सामग्री में कुछ असामान्य (गैर-एएससीआईआई) अक्षर हों, लेकिन तब इससे फर्क पड़ेगा।

वैसे, तथ्य यह है कि यह मायने रखता है यही कारण है कि पायथन बाइनरी और टेक्स्ट डेटा के लिए दो अलग-अलग प्रकारों का उपयोग करने के लिए स्थानांतरित हुआ: यह उनके बीच जादुई रूप से परिवर्तित नहीं हो सकता, क्योंकि यह एन्कोडिंग को नहीं जानता जब तक कि आप इसे नहीं बताते! एकमात्र तरीका आपको पता होगा कि विंडोज प्रलेखन को पढ़ना है (या इसे यहां पढ़ें)।


3
open()टेक्स्ट स्ट्रीम के लिए फ़ंक्शन या Popen()यदि आप इसे पास करते हैं universal_newlines=Trueतो यह जादुई रूप से आपके लिए वर्ण एन्कोडिंग तय करता है ( locale.getpreferredencoding(False)पायथन 3.3+ में)।
17

2
'latin-1'सभी कोड बिंदुओं के साथ एक वर्बेटिम एन्कोडिंग है, जिससे आप इसका उपयोग कर सकते हैं कि बाइट स्ट्रिंग को प्रभावी ढंग से पढ़ने के लिए जो आपके स्ट्रिंग स्ट्रिंग के पायथन सपोर्ट करता है (तो पायथन 2 पर पायबेटिम, पायथन 3 के लिए यूनिकोड में)।
ट्रिपलए

@tripleee: मोजिबेक 'latin-1'पाने का एक अच्छा तरीका है। इसके अलावा विंडोज पर जादुई प्रतिस्थापन हैं: आश्चर्यजनक रूप से डेटा को एक प्रक्रिया से दूसरे dir\xb6\x14
अनमॉडिफ़ाइड में

32

Universal_newlines को True पर सेट करें, अर्थात

command_stdout = Popen(['ls', '-l'], stdout=PIPE, universal_newlines=True).communicate()[0]

5
मैं इस पद्धति का उपयोग कर रहा हूं और यह काम करता है। हालाँकि, यह आपके सिस्टम पर उपयोगकर्ता की प्राथमिकताओं के आधार पर एन्कोडिंग का अनुमान लगा रहा है, इसलिए यह कुछ अन्य विकल्पों की तरह मजबूत नहीं है। यह वही है जो यह कर रहा है, docs.python.org/3.4/library/subprocess.html को संदर्भित करते हुए: "यदि Universal_newlines सत्य है, [स्टड, स्टडआउट और स्ट्राइडर] को लोकल द्वारा लौटाए गए एन्कोडिंग का उपयोग करके यूनिवर्सल न्यूलाइन्स मोड में टेक्स्ट स्ट्रीम के रूप में खोला जाएगा। .getpreferredencoding (झूठी)। "
ट्वासब्रिलिग

3.7 केtext=True बजाय आप कर सकते हैं (और चाहिए) universal_newlines=True
बोरिस

23

जबकि @Aaron Maenpaa का जवाब सिर्फ काम करता है, एक उपयोगकर्ता ने हाल ही में पूछा :

क्या कोई और सरल तरीका है? 'fhand.read ()। डीकोड ("ASCII")' [...] यह इतना लंबा है!

आप उपयोग कर सकते हैं:

command_stdout.decode()

decode()एक मानक तर्क है :

codecs.decode(obj, encoding='utf-8', errors='strict')


.decode()यह उपयोग 'utf-8'विफल हो सकता है (कमांड का आउटपुट एक अलग वर्ण एन्कोडिंग का उपयोग कर सकता है या यहां तक ​​कि एक अवांछनीय बाइट अनुक्रम भी लौटा सकता है)। हालांकि अगर इनपुट एससीआई (यूटीएफ -8 का सबसेट) है तो .decode()काम करता है।
JFS

22

पाठ के रूप में बाइट अनुक्रम की व्याख्या करने के लिए, आपको संबंधित वर्ण एन्कोडिंग को जानना होगा:

unicode_text = bytestring.decode(character_encoding)

उदाहरण:

>>> b'\xc2\xb5'.decode('utf-8')
'µ'

lsकमांड आउटपुट उत्पन्न कर सकता है जिसे टेक्स्ट के रूप में व्याख्यायित नहीं किया जा सकता है। यूनिक्स पर फ़ाइल नाम स्लैश b'/'और शून्य को छोड़कर बाइट्स का कोई भी क्रम हो सकता है b'\0':

>>> open(bytes(range(0x100)).translate(None, b'\0/'), 'w').close()

Utf-8 एन्कोडिंग का उपयोग करके ऐसे बाइट सूप को डीकोड करने की कोशिश की जाती है UnicodeDecodeError

यह बदतर हो सकता है। यदि आप गलत असंगत एन्कोडिंग का उपयोग करते हैं तो डिकोडिंग चुपचाप विफल हो सकती है और मोज़िबेक का उत्पादन कर सकती है :

>>> '—'.encode('utf-8').decode('cp1252')
'—'

डेटा दूषित है, लेकिन आपका प्रोग्राम इस बात से अनजान है कि कोई विफलता हुई है।

सामान्य तौर पर, किस वर्ण एन्कोडिंग का उपयोग करना है, यह बाइट अनुक्रम में ही अंतर्निहित नहीं है। आपको इस जानकारी को बैंड के बाहर संचार करना होगा। कुछ परिणाम दूसरों की तुलना में अधिक होने की संभावना है और इसलिए chardetमॉड्यूल मौजूद है जो चरित्र एन्कोडिंग का अनुमान लगा सकता है । एक एकल पायथन स्क्रिप्ट विभिन्न स्थानों में कई वर्ण एन्कोडिंग का उपयोग कर सकती है।


lsउत्पादन एक अजगर का उपयोग कर स्ट्रिंग के लिए परिवर्तित किया जा सकता os.fsdecode() समारोह है कि यहां तक कि के लिए सफल होता है undecodable फ़ाइल नाम (इसे इस्तेमाल करता है sys.getfilesystemencoding()और surrogateescapeयूनिक्स पर त्रुटि हैंडलर):

import os
import subprocess

output = os.fsdecode(subprocess.check_output('ls'))

मूल बाइट्स प्राप्त करने के लिए, आप उपयोग कर सकते हैं os.fsencode()

यदि आप universal_newlines=Trueपैरामीटर पास करते हैं, तो बाइट्स को डीकोड करने के लिए subprocessउपयोग करता locale.getpreferredencoding(False)है, यह cp1252विंडोज पर हो सकता है।

मक्खी पर बाइट स्ट्रीम को डिकोड करने के लिए, io.TextIOWrapper() इस्तेमाल किया जा सकता है: उदाहरण

विभिन्न कमांड अपने आउटपुट के लिए अलग-अलग वर्ण एन्कोडिंग का उपयोग कर सकते हैं जैसे, dirआंतरिक कमांड ( cmd) cp437 का उपयोग कर सकते हैं। इसका आउटपुट डीकोड करने के लिए, आप एन्कोडिंग को स्पष्ट रूप से पास कर सकते हैं (पायथन 3.6+):

output = subprocess.check_output('dir', shell=True, encoding='cp437')

फ़ाइल नाम से भिन्न हो सकते हैं os.listdir()(जो विंडोज यूनिकोड एपीआई का उपयोग करता है), उदाहरण के लिए, यू + 00 बी 6 (¶) के बजाय चरित्र U + 0014 को नियंत्रित करने के लिए -Python के cp437 कोडेक नक्शे के '\xb6'साथ प्रतिस्थापित किया जा सकता है । मनमाने ढंग से यूनिकोड वर्णों के साथ फ़ाइल नाम का समर्थन करने के लिए, डिकोड पॉवरशेल आउटपुट देखें, जिसमें संभवतः गैर-ASCII यूनिकोड वर्ण पायथन स्ट्रिंग में हों।'\x14'b'\x14'


16

चूंकि यह सवाल वास्तव में subprocessआउटपुट के बारे में पूछ रहा है , इसलिए आपके पास एन्कोडिंग कीवर्ड (पायथन 3.6+ में) Popenस्वीकार करने के बाद से अधिक प्रत्यक्ष दृष्टिकोण उपलब्ध है :

>>> from subprocess import Popen, PIPE
>>> text = Popen(['ls', '-l'], stdout=PIPE, encoding='utf-8').communicate()[0]
>>> type(text)
str
>>> print(text)
total 0
-rw-r--r-- 1 wim badger 0 May 31 12:45 some_file.txt

अन्य उपयोगकर्ताओं के लिए सामान्य उत्तर बाइट्स को पाठ में डिकोड करना है :

>>> b'abcde'.decode()
'abcde'

बिना किसी तर्क के, sys.getdefaultencoding()उपयोग किया जाएगा। यदि आपका डेटा नहीं है sys.getdefaultencoding(), तो आपको decodeकॉल में एन्कोडिंग स्पष्ट रूप से निर्दिष्ट करना होगा :

>>> b'caf\xe9'.decode('cp1250')
'café'

3
या Python 3.7 के साथ आप text=Trueदिए गए एन्कोडिंग (यदि सेट) या सिस्टम डिफॉल्ट अन्यथा का उपयोग करके स्टड, स्टडआउट और स्टेडर को डीकोड कर सकते हैं । Popen(['ls', '-l'], stdout=PIPE, text=True)
बोरिस

डिकोडिंग lsआउटपुट का उपयोग utf-8एन्कोडिंग विफल हो सकता है ( 2016 से मेरे उत्तर में उदाहरण देखें )।
jfs

1
@ बोरिस: यदि encodingपैरामीटर दिया जाता है, तो textपैरामीटर को अनदेखा किया जाता है।
jfs

11

यदि आपको प्रयास करके निम्नलिखित प्राप्त करना चाहिए decode():

गुण: 'str' ऑब्जेक्ट में कोई विशेषता 'डीकोड' नहीं है

आप एक कास्ट में सीधे एन्कोडिंग प्रकार भी निर्दिष्ट कर सकते हैं:

>>> my_byte_str
b'Hello World'

>>> str(my_byte_str, 'utf-8')
'Hello World'

6

विंडोज सिस्टम के डेटा के साथ काम करते समय ( \r\nलाइन एंडिंग के साथ ), मेरा जवाब है

String = Bytes.decode("utf-8").replace("\r\n", "\n")

क्यों? एक बहु-इनपुट Input.txt के साथ इसे आज़माएँ:

Bytes = open("Input.txt", "rb").read()
String = Bytes.decode("utf-8")
open("Output.txt", "w").write(String)

आपकी सभी पंक्ति समाप्ति दोगुनी (से \r\r\n) हो जाएगी , जिससे अतिरिक्त खाली लाइनें हो जाएंगी । पायथन के टेक्स्ट-रीड फ़ंक्शंस आमतौर पर लाइन एंडिंग्स को सामान्य करते हैं ताकि स्ट्रिंग्स केवल उपयोग करें \n। यदि आप विंडोज सिस्टम से बाइनरी डेटा प्राप्त करते हैं, तो पायथन के पास ऐसा करने का मौका नहीं है। इस प्रकार,

Bytes = open("Input.txt", "rb").read()
String = Bytes.decode("utf-8").replace("\r\n", "\n")
open("Output.txt", "w").write(String)

आपकी मूल फ़ाइल को दोहराया जाएगा।


मैं .replace("\r\n", "\n")इसके अलावा लंबे समय से देख रहा था । यदि आप HTML को ठीक से प्रस्तुत करना चाहते हैं तो यह उत्तर है।
मुहल्लेका

5

मैंने एक सूची को साफ करने के लिए एक फ़ंक्शन बनाया

def cleanLists(self, lista):
    lista = [x.strip() for x in lista]
    lista = [x.replace('\n', '') for x in lista]
    lista = [x.replace('\b', '') for x in lista]
    lista = [x.encode('utf8') for x in lista]
    lista = [x.decode('utf8') for x in lista]

    return lista

6
आप वास्तव में के सभी श्रृंखला कर सकते हैं .strip, .replace, .encodeऔर एक सूची समझ में, आदि कॉल केवल पुनरावृति सूची पर एक बार के बजाय बार-बार दोहराना की इस पर पांच बार।
टेलर एड्मिस्टन

1
@TaylorEdmiston शायद यह आवंटन पर बचाता है, लेकिन संचालन की संख्या समान रहेगी।
जुलिएनड जूल 28'17

5

पायथन 3 के लिए, यह बहुत सुरक्षित और पाइथोनिक दृष्टिकोण से परिवर्तित करने के byteलिए है string:

def byte_to_str(bytes_or_str):
    if isinstance(bytes_or_str, bytes): # Check if it's in bytes
        print(bytes_or_str.decode('utf-8'))
    else:
        print("Object not of byte type")

byte_to_str(b'total 0\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1\n-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2\n')

आउटपुट:

total 0
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file1
-rw-rw-r-- 1 thomas thomas 0 Mar  3 07:03 file2

5
1) जैसा कि @bodangly ने कहा, टाइप चेकिंग पाइथोनिक नहीं है। 2) आपके द्वारा लिखे गए फ़ंक्शन का नाम " byte_to_str" है, जिसका अर्थ है कि यह एक str लौटाएगा, लेकिन यह केवल परिवर्तित मूल्य को प्रिंट करता है, और यह विफल होने पर एक त्रुटि संदेश प्रिंट करता है (लेकिन अपवाद नहीं उठाता है)। यह दृष्टिकोण भी unpythonic है और bytes.decodeआपके द्वारा प्रदान किए गए समाधान को बाधित करता है।
कॉस्मिकफ्लुक

3

से सिस - सिस्टम-विशिष्ट पैरामीटर और कार्यों :

मानक धाराओं से / से बाइनरी डेटा लिखने या पढ़ने के लिए, अंतर्निहित बाइनरी बफर का उपयोग करें। उदाहरण के लिए, बाइट्स टू स्टडआउट, लिखने के लिए उपयोग करें sys.stdout.buffer.write(b'abc')


3
उपप्रोसेस को पाइप पहले से ही एक बाइनरी बफर है। आपका जवाब पता करने में विफल रहता है कि परिणामी bytesमूल्य से स्ट्रिंग मान कैसे प्राप्त करें ।
मार्टिज़न पीटर

1
def toString(string):    
    try:
        return v.decode("utf-8")
    except ValueError:
        return string

b = b'97.080.500'
s = '97.080.500'
print(toString(b))
print(toString(s))

1
हालांकि यह कोड प्रश्न का उत्तर दे सकता है, कैसे और / या के बारे में अतिरिक्त संदर्भ प्रदान करता है लेकिन समस्या का हल क्यों करता है करने से उत्तर के दीर्घकालिक मूल्य में सुधार होगा। याद रखें कि आप भविष्य में पाठकों के लिए सवाल का जवाब दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है! कृपया स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें, और इस बात का संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं। यह भी उल्लेख करने के लिए चोट नहीं करता है कि यह उत्तर दूसरों की तुलना में अधिक उपयुक्त क्यों है।
देव-आईएल

एक स्पष्टीकरण क्रम में होगा।
पीटर मोर्टेंसन

1

पायथॉन 3.7 पर "शेल कमांड को चलाने और टेक्स्ट के रूप में इसके आउटपुट को प्राप्त करने के अपने विशिष्ट मामले के लिए", आपको उपयोग करना चाहिए subprocess.runऔर पास होना चाहिए text=True(साथ ही capture_output=Trueआउटपुट कैप्चर करना चाहिए )

command_result = subprocess.run(["ls", "-l"], capture_output=True, text=True)
command_result.stdout  # is a `str` containing your program's stdout

textकहा जाता universal_newlinesथा, और पायथन 3.7 में (अच्छी तरह से अलियास) बदल दिया गया था। यदि आप 3.7 से पहले पायथन संस्करणों का समर्थन करना चाहते हैं, तो universal_newlines=Trueइसके बजाय पास करेंtext=True


0

यदि आप किसी भी बाइट को परिवर्तित करना चाहते हैं, तो न केवल स्ट्रिंग बाइट में परिवर्तित होती है:

with open("bytesfile", "rb") as infile:
    str = base64.b85encode(imageFile.read())

with open("bytesfile", "rb") as infile:
    str2 = json.dumps(list(infile.read()))

हालांकि यह बहुत कुशल नहीं है। यह 2 एमबी की तस्वीर को 9 एमबी में बदल देगा।


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