2017-10-11 17 views
0

lxmlを使用してXMLを解析しているときに、"読み取りファイルオブジェクトはバイトオブジェクトを返さなければなりません"というエラーメッセージが表示されます。ここでは、コードlxmlの解析中にエラーが発生しました

from lxml import etree 
from io import StringIO 
def parseXML(xmlFile): 
    """ 
    parse the xml 
    """ 
    data=open(xmlFile) 
    xml=data.read() 
    data.close() 

    tree=etree.parse(StringIO(xml)) 
    context=etree.iterparse(StringIO(xml)) 
    for action, elem in context: 
     if not elem.text: 
      if not elem.text: 
       text="None" 
      else: 
       text=elem.text 
      print(elem.tag + "=>" + text) 
if __name__ == "__main__": 
    parseXML("C:\\Users\\karthik\Desktop\\xml_path\\bgm.xml") 

BGMのXMLです

<?xml version="1.0" ?> 
<zAppointments reminder="15"> 
    <appointment> 
     <begin>1181251680</begin> 
     <uid>040000008200E000</uid> 
     <alarmTime>1181572063</alarmTime> 
     <state></state> 
     <location></location> 
     <duration>1800</duration> 
     <subject>Bring pizza home</subject> 
    </appointment> 
    <appointment> 
     <begin>1234360800</begin> 
     <duration>1800</duration> 
     <subject>Check MS Office website for updates</subject> 
     <location></location> 
     <uid>604f4792-eb89-478b-a14f-dd34d3cc6c21-1234360800</uid> 
     <state>dismissed</state> 
    </appointment> 
</zAppointments> 

エラー:終了コードで終了し

Traceback (most recent call last): 
    File "C:/Users/karthik/source/ChartAttributes/crecords", line 34, in <module> 
    parseXML("C:\\Users\\karthik\\Desktop\\xml_path\\bgm.xml") 
    File "C:/Users/karthik/source/ChartAttributes/crecords", line 26, in parseXML 
    for action, elem in context: 
    File "src\lxml\iterparse.pxi", line 208, in lxml.etree.iterparse.__next__ (src\lxml\lxml.etree.c:150010) 
    File "src\lxml\iterparse.pxi", line 193, in lxml.etree.iterparse.__next__ (src\lxml\lxml.etree.c:149708) 
    File "src\lxml\iterparse.pxi", line 221, in lxml.etree.iterparse._read_more_events (src\lxml\lxml.etree.c:150208) 
TypeError: reading file objects must return bytes objects 

プロセス1

+0

ファイルを文字列に読み込み、StringIOでラップするのではなく、 'xml = etree.parse(xmlFile)'を直接実行するだけの理由はありますか? –

+0

私はちょうどこのブログに続いています。https://www.blog.pythonlibrary.org/2010/11/20/python-parsing-xml-with-lxml/ – karthik

+0

さて、...と一緒に 'etree.parse'を使ってみてください。ファイル名を確認して何が起こるかを確認してください –

答えて

0

は、私はあなたがバイト配列としてではなくXMLが必要だと思います文字列。

オープンbytesオブジェクトを取得するには、バイナリモードでファイル:

data=open(xmlFile, 'rb') 

をしかし、それはlxmlのと、それは開口部の世話をして、ファイルを読み込むようにするには、ファイル名を渡すためにおそらくちょうど簡単です:

from lxml import etree 

def parseXML(xmlFile): 
    for action, elem in etree.iterparse(xmlFile): 
     text = elem.text or "None" 
     print(elem.tag + "=>" + text) 
+0

私はerrorTraceback(最近の最後の呼び出し最後)を取得する 'b'を追加しました: ファイル "C:/ Users/karthik/source/ChartAttributes/crecords"、の34行目 parseXML ファイル "C:/ Users/karthik/source/ChartAttributes/crecords"、行20、parseXML ファイル= open( "C:¥¥Users¥¥karthik¥Desktop¥¥xml_path¥¥bgm.xml") (xm lFile、 'b') ValueError:rbを編集した後も、作成/読み取り/書き込み/追加モードと、最大で1つだけプラスの – karthik

+0

を持っていなければなりませんTypeError:initial_valueはバイトではなくstrまたはNoneでなければなりません – karthik

関連する問題