बिल्टइन। टाइप करे: बाइट होना चाहिए, बाइट नहीं


220

मैंने अपनी स्क्रिप्ट पाइथन 2.7 से 3.2 में बदल दी है, और मेरे पास एक बग है।

# -*- coding: utf-8 -*-
import time
from datetime import date
from lxml import etree
from collections import OrderedDict

# Create the root element
page = etree.Element('results')

# Make a new document tree
doc = etree.ElementTree(page)

# Add the subelements
pageElement = etree.SubElement(page, 'Country',Tim = 'Now', 
                                      name='Germany', AnotherParameter = 'Bye',
                                      Code='DE',
                                      Storage='Basic')
pageElement = etree.SubElement(page, 'City', 
                                      name='Germany',
                                      Code='PZ',
                                      Storage='Basic',AnotherParameter = 'Hello')
# For multiple multiple attributes, use as shown above

# Save to XML file
outFile = open('output.xml', 'w')
doc.write(outFile) 

अंतिम पंक्ति में, मुझे यह त्रुटि मिली:

builtins.TypeError: must be str, not bytes
File "C:\PythonExamples\XmlReportGeneratorExample.py", line 29, in <module>
  doc.write(outFile)
File "c:\Python32\Lib\site-packages\lxml\etree.pyd", line 1853, in lxml.etree._ElementTree.write (src/lxml/lxml.etree.c:44355)
File "c:\Python32\Lib\site-packages\lxml\etree.pyd", line 478, in lxml.etree._tofilelike (src/lxml/lxml.etree.c:90649)
File "c:\Python32\Lib\site-packages\lxml\etree.pyd", line 282, in lxml.etree._ExceptionContext._raise_if_stored (src/lxml/lxml.etree.c:7972)
File "c:\Python32\Lib\site-packages\lxml\etree.pyd", line 378, in lxml.etree._FilelikeWriter.write (src/lxml/lxml.etree.c:89527)

मैंने पायथन 3.2 स्थापित किया है, और मैंने lxml-2.3.win32-py3.2.exe स्थापित किया है।

पायथन 2.7 पर यह काम करता है।


10
वास्तव में इसकी जांच नहीं की, लेकिन एक त्वरित अनुमान यह है कि आपको फ़ाइल को बाइनरी मोड में खोलना चाहिए।
स्वेन मार्नाच

जवाबों:


484

आउटफिट बाइनरी मोड में होना चाहिए।

outFile = open('output.xml', 'wb')

100
होश उड़ जाना। Python3 ने उस छोटे 'बी' के साथ क्या करना है, इसे फिर से बताया है। यह केवल उन विंडोज उपयोगकर्ताओं को परेशान करता था जो इसे शामिल करना भूल जाते थे (या इसलिए नहीं कर सकते थे क्योंकि वे stdio का उपयोग कर रहे थे)। अब यह सभी प्लेटफार्मों पर पायथन उपयोगकर्ताओं को परेशान कर सकता है। उम्मीद है, यह दर्द के लायक होगा।
नोबार

5
यदि आप पाठ पार्स कर रहे हैं तो यह निश्चित रूप से इसके लायक है।
लेन्नर्ट रेग्रोब

@nobar यूनिवर्सल न्यूलाइन सपोर्ट को बंद करना आवश्यक है, legacy.python.org/dev/peps/pep-0278 , जो कि पायथन 3 में डिफ़ॉल्ट रूप से है
user7610

Python3 के लिए भी gzip में मेरे लिए काम करता है! json.load(gzip.open('file.json.gz'))विफल रहता है, और json.load(gzip.open('file.json.gz', 'rt'))सफल होता है!
हॉब्स

@ LennartRegebro, यदि सिस्टम सेटिंग अप्रत्याशित नहीं है। बाइनरी सबसे अच्छा और कम त्रुटि प्रवण है। अगर यह काम करता है तो यह वास्तव में काम करता है। पाठ के रूप में, वहाँ हमेशा एक "क्या होगा अगर" शामिल है।
पचेरियर

6

बाइनरी फ़ाइल को बेस 64 और इसके विपरीत में कनवर्ट करें। अजगर 3.5.2 में सिद्ध करें

import base64

read_file = open('/tmp/newgalax.png', 'rb')
data = read_file.read()

b64 = base64.b64encode(data)

print (b64)

# Save file
decode_b64 = base64.b64decode(b64)
out_file = open('/tmp/out_newgalax.png', 'wb')
out_file.write(decode_b64)

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