2016-05-04 18 views
0

Ich habe die folgende Struktur XML und ich versuche, es in eine csv in Python zu konvertieren:Convert xml csv in Python

<FIXML><Batch> 
<PosRpt RptID="34868232064" ReqID="C905EOD20160427" SetSesID="EOD" MtchStat="0" PriSetPx="326.6" SetPx="328.3" SetPxTyp="1" SettlCcy="USD" ReqTyp="1" MsgEvtSrc="REG" BizDt="2016-04-27" SettlDt="2016-07-14" SettlCurrFxRt="1"><Pty ID="CME" R="21"></Pty><Pty ID="905" R="4"></Pty><Pty ID="CBT" R="22"></Pty><Pty ID="905" R="38"><Sub ID="1" Typ="26"/></Pty><Pty ID="905" R="1"></Pty><Instrmt ID="06" Desc="SOYBEAN MEAL FUTURES" CFI="FCAPSO" SecTyp="FUT" Src="H" MMY="201607" MatDt="2016-07-14" Mult="100" Exch="CBT" UOM="tn" UOMQty="100" PxUOM="TON" PxUOMQty="1" ValMeth="FUT" Fctr="1" PxQteCcy="USD" FnlSettlCcy="USD"></Instrmt><Qty Long="2038" Short="1354" Typ="ETR"/><Qty Long="1289" Short="1436" Typ="ALC"/><Qty Long="0" Short="10" Typ="TRF"/><Qty Long="4122" Short="8098" Typ="SOD"/><Qty Long="3957" Short="7406" Typ="FIN"/><Qty Long="937" Short="6325" Typ="IES"/><Qty Long="35" Short="55" Typ="IAS"/><Amt Typ="SMTM" Amt="-675920" Ccy="USD"/><Amt Typ="TVAR" Amt="-325070.33" Ccy="USD"/><Amt Typ="FMTM" Amt="-1000990.33" Ccy="USD"/></PosRpt> 
<TrdCaptRpt RptID="21195360680" TrdTyp="0" TrdSubTyp="5" ExecID="85271320160426220810TN0002521" TrdDt="2016-04-27" BizDt="2016-04-27" MLegRptTyp="1" MtchStat="0" MsgEvtSrc="REG" TrdID="106695" LastQty="1" LastPx="323.5" TxnTm="2016-04-27T01:10:25-05:00" SettlCcy="USD" SettlDt="2016-07-14" PxSubTyp="1" VenueTyp="E" VenuTyp="E" OfstInst="0"><Instrmt ID="06" Desc="SOYBEAN MEAL FUTURES" CFI="FCAPSO" SecTyp="FUT" MMY="201607" MatDt="2016-07-14" Mult="100" Exch="CBT" UOM="tn" UOMQty="100" PxUOM="TON" PxUOMQty="1" ValMeth="FUT" Fctr="1" PxQteCcy="USD"></Instrmt><Amt Typ="TVAR" Amt="480" Ccy="USD"/><RptSide Side="1" ClOrdID="25245816" CustCpcty="4" OrdTyp="M" SesID="EOD" SesSub="E" AllocInd="1" AgrsrInd="Y"><Pty ID="CME" R="21"></Pty><Pty ID="905" R="4"></Pty><Pty ID="CBT" R="22"></Pty><Pty ID="905" R="1"></Pty><Pty ID="434GU400" R="24"><Sub ID="1" Typ="26"/></Pty><Pty ID="4QOL" R="12"></Pty><Pty ID="685" R="17"></Pty><Pty ID="4QOL" R="37"></Pty><Pty ID="905" R="38"><Sub ID="1" Typ="26"/></Pty><Pty ID="905" R="7"></Pty><RegTrdID ID="FECC1544943BFEC0302D5F8342" Src="1010000023" Typ="0" Evnt="2"/></RptSide></TrdCaptRpt> 
<TrdCaptRpt RptID="21196531008" TrdTyp="0" TrdSubTyp="5" ExecID="88421020160427065733TN0007200" TrdDt="2016-04-27" BizDt="2016-04-27" MLegRptTyp="1" MtchStat="0" MsgEvtSrc="REG" TrdID="115357" LastQty="2" LastPx="325.7" TxnTm="2016-04-27T07:00:12-05:00" SettlCcy="USD" SettlDt="2016-07-14" PxSubTyp="1" VenueTyp="E" VenuTyp="E" OfstInst="0"><Instrmt ID="06" Desc="SOYBEAN MEAL FUTURES" CFI="FCAPSO" SecTyp="FUT" MMY="201607" MatDt="2016-07-14" Mult="100" Exch="CBT" UOM="tn" UOMQty="100" PxUOM="TON" PxUOMQty="1" ValMeth="FUT" Fctr="1" PxQteCcy="USD"></Instrmt><Amt Typ="TVAR" Amt="-520" Ccy="USD"/><RptSide Side="2" ClOrdID="25246712" CustCpcty="4" OrdTyp="M" SesID="EOD" SesSub="E" AllocInd="1" AgrsrInd="Y"><Pty ID="CME" R="21"></Pty><Pty ID="905" R="4"></Pty><Pty ID="CBT" R="22"></Pty><Pty ID="905" R="1"></Pty><Pty ID="434GU400" R="24"><Sub ID="1" Typ="26"/></Pty><Pty ID="4QOL" R="12"></Pty><Pty ID="685" R="17"></Pty><Pty ID="4QOL" R="37"></Pty><Pty ID="905" R="38"><Sub ID="1" Typ="26"/></Pty><Pty ID="905" R="7"></Pty><RegTrdID ID="FECC1544943BFEC0302D64A564" Src="1010000023" Typ="0" Evnt="2"/></RptSide></TrdCaptRpt> 
<PosRpt RptID="34868266266" ReqID="C905EOD20160427" SetSesID="EOD" MtchStat="0" PriSetPx="136" SetPx="136" SetPxTyp="1" SettlCcy="USD" ReqTyp="1" MsgEvtSrc="REG" BizDt="2016-04-27" SettlDt="2016-12-28" SettlCurrFxRt="1"><Pty ID="CME" R="21"></Pty><Pty ID="905" R="4"></Pty><Pty ID="CBT" R="22"></Pty><Pty ID="99106105" R="38"><Sub ID="2" Typ="26"/></Pty><Pty ID="905" R="1"></Pty><Instrmt ID="UFU" Desc="UAN FOB NOLA SWAP" CFI="FCACSO" SecTyp="FUT" Src="H" MMY="201612" MatDt="2016-12-28" Mult="100" Exch="CBT" UOM="tn" UOMQty="100" PxUOM="TON" PxUOMQty="1" ValMeth="FUT" Fctr="1" PxQteCcy="USD" FnlSettlCcy="USD"></Instrmt><Qty Long="30" Short="0" Typ="SOD"/><Qty Long="30" Short="0" Typ="FIN"/><Qty Long="30" Short="0" Typ="IES"/><Amt Typ="SMTM" Amt="0" Ccy="USD"/><Amt Typ="TVAR" Amt="0" Ccy="USD"/><Amt Typ="FMTM" Amt="0" Ccy="USD"/><RegTrdID ID="PSC152CEF79387P0203D81FA" Src="1010000023" Typ="0" Evnt="2"/></PosRpt> 
<PosRpt RptID="34868372999" ReqID="C905EOD20160427" SetSesID="EOD" MtchStat="0" PriSetPx="675.25" SetPx="669.25" SetPxTyp="1" SettlCcy="USD" ReqTyp="1" MsgEvtSrc="REG" BizDt="2016-04-27" SettlDt="2016-06-30" SettlCurrFxRt="1"><Pty ID="CME" R="21"></Pty><Pty ID="905" R="4"></Pty><Pty ID="CME" R="22"></Pty><Pty ID="98812736" R="38"><Sub ID="2" Typ="26"/></Pty><Pty ID="905" R="1"></Pty><Instrmt ID="CPC" Desc="MALAYSIAN CRUDE PALM OIL CAL S" CFI="FCACSO" SecTyp="FUT" Src="H" MMY="201606" MatDt="2016-06-30" Mult="25" Exch="CME" UOMQty="25" PxUOM="MTONS" PxUOMQty="1" ValMeth="FUT" Fctr="1" PxQteCcy="USD" FnlSettlCcy="USD"></Instrmt><Qty Long="0" Short="200" Typ="SOD"/><Qty Long="0" Short="200" Typ="FIN"/><Qty Long="0" Short="200" Typ="IES"/><Amt Typ="SMTM" Amt="30000" Ccy="USD"/><Amt Typ="TVAR" Amt="0" Ccy="USD"/><Amt Typ="FMTM" Amt="30000" Ccy="USD"/><RegTrdID ID="PSC154373D5298P0302DFC70" Src="1010000023" Typ="0" Evnt="2"/></PosRpt> 
<PosRpt RptID="34868373000" ReqID="C905EOD20160427" SetSesID="EOD" MtchStat="0" PriSetPx="665.75" SetPx="661.5" SetPxTyp="1" SettlCcy="USD" ReqTyp="1" MsgEvtSrc="REG" BizDt="2016-04-27" SettlDt="2016-11-30" SettlCurrFxRt="1"><Pty ID="CME" R="21"></Pty><Pty ID="905" R="4"></Pty><Pty ID="CME" R="22"></Pty><Pty ID="98812736" R="38"><Sub ID="2" Typ="26"/></Pty><Pty ID="905" R="1"></Pty><Instrmt ID="CPC" Desc="MALAYSIAN CRUDE PALM OIL CAL S" CFI="FCACSO" SecTyp="FUT" Src="H" MMY="201611" MatDt="2016-11-30" Mult="25" Exch="CME" UOMQty="25" PxUOM="MTONS" PxUOMQty="1" ValMeth="FUT" Fctr="1" PxQteCcy="USD" FnlSettlCcy="USD"></Instrmt><Qty Long="0" Short="400" Typ="SOD"/><Qty Long="0" Short="400" Typ="FIN"/><Qty Long="0" Short="400" Typ="IES"/><Amt Typ="SMTM" Amt="42500" Ccy="USD"/><Amt Typ="TVAR" Amt="0" Ccy="USD"/><Amt Typ="FMTM" Amt="42500" Ccy="USD"/><RegTrdID ID="PSC1540E0A7EA6P0302DFB8E" Src="1010000023" Typ="0" Evnt="2"/></PosRpt> 
<TrdCaptRpt RptID="21202575211" TrdTyp="0" TrdDt="2016-04-27" BizDt="2016-04-27" MLegRptTyp="2" MtchStat="1" MsgEvtSrc="REG" TrdID="000991" LastQty="100" LastPx="0.31" TxnTm="2016-04-27T12:33:54-05:00" SettlCcy="USD" SettlDt="2016-08-03" OrigTrdID="15457C3D779LEB0202D1BC6" PxSubTyp="1" VenueTyp="P" VenuTyp="P"><Instrmt ID="DA" Desc="CLASS III MILK OPTIONS" CFI="OCAXPS" SecTyp="OOF" MMY="201607" MatDt="2016-08-03" StrkPx="13.75" Mult="2000" Exch="CME" UOM="lbs" UOMQty="200000" PxUOM="LBS" PxUOMQty="100" PutCall="1" ValMeth="EQTY" Fctr="1" PxQteCcy="USD"></Instrmt><Undly CFI="FCACSO" Desc="CLASS III MILK FUTURES" ID="DA" Src="H" MMY="201607" SecTyp="FUT" Exch="CME"></Undly><Amt Typ="PREM" Amt="62000" Ccy="USD"/><RptSide Side="2" ClOrdID="660" CustCpcty="4" OrdTyp="L" SesID="EOD" SesSub="P" TmBkt="V" AllocInd="1" AgrsrInd="Y"><Pty ID="CME" R="21"></Pty><Pty ID="905" R="4"></Pty><Pty ID="CME" R="22"></Pty><Pty ID="905" R="1"></Pty><Pty ID="77040322" R="24"><Sub ID="1" Typ="26"/></Pty><Pty ID="BKF" R="12"></Pty><Pty ID="826" R="17"></Pty><Pty ID="BLT" R="37"></Pty><Pty ID="905" R="38"><Sub ID="1" Typ="26"/></Pty><Pty ID="905" R="7"></Pty><RegTrdID ID="FECC15457C3D779LEB0202D1BC8" Src="1010000023" Typ="0" Evnt="2"/></RptSide></TrdCaptRpt> 
<TrdCaptRpt RptID="21206412158" TrdTyp="0" TrdSubTyp="5" TrdDt="2016-04-27" BizDt="2016-04-27" MLegRptTyp="1" MtchStat="1" MsgEvtSrc="REG" TrdID="124710" LastQty="5" LastPx="0.13" SettlCcy="USD" SettlDt="2016-08-31" PxSubTyp="1" VenueTyp="P" VenuTyp="P" OfstInst="0"><Instrmt ID="DA" Desc="CLASS III MILK OPTIONS" CFI="OPAXPS" SecTyp="OOF" MMY="201608" MatDt="2016-08-31" StrkPx="13" Mult="2000" Exch="CME" UOM="lbs" UOMQty="200000" PxUOM="LBS" PxUOMQty="100" PutCall="0" ValMeth="EQTY" Fctr="1" PxQteCcy="USD"></Instrmt><Undly CFI="FCACSO" Desc="CLASS III MILK FUTURES" ID="DA" Src="H" MMY="201608" SecTyp="FUT" Exch="CME"></Undly><Amt Typ="PREM" Amt="1300" Ccy="USD" SettlDt="2016-04-27"/><RptSide Side="2" ClOrdID="726" CustCpcty="4" OrdTyp="L" SesID="EOD" SesSub="P" TmBkt="M" AllocInd="1" AgrsrInd="Y"><Pty ID="CME" R="21"></Pty><Pty ID="905" R="4"></Pty><Pty ID="CME" R="22"></Pty><Pty ID="905" R="1"></Pty><Pty ID="7704038A" R="24"><Sub ID="1" Typ="26"/></Pty><Pty ID="GRTY" R="12"></Pty><Pty ID="888" R="17"></Pty><Pty ID="GRTY" R="37"></Pty><Pty ID="905" R="38"><Sub ID="1" Typ="26"/></Pty><Pty ID="905" R="7"></Pty><RegTrdID ID="FECC1544943BFEC0302D9028AE" Src="1010000023" Typ="0" Evnt="2"/></RptSide></TrdCaptRpt> 
</Batch></FIXML> 

Und ich versuche diese in eine CSV-Datei zu konvertieren. Ich habe es mit dem folgenden Code versucht, aber ich kann; t die richtige Ausgabe:

from xml.etree import ElementTree 
import csv 

my_list = [] 

with open('/Users/testuser/Desktop/CMEREG1.XML', 'rt') as f: 
    tree = ElementTree.parse(f) 

for node in tree.iter('TrdCaptRpt'): 
    RptID = node.attrib.get('RptID') 
    TrdTyp = node.attrib.get('TrdTyp') 
    TrdSubTyp = node.attrib.get('TrdSubTyp') 
    TrdDt = node.attrib.get('TrdDt') 
    BizDt = node.attrib.get('BizDt') 
    MLegRptTyp = node.attrib.get('MLegRptTyp') 
    MtchStat = node.attrib.get('MtchStat') 
    MsgEvtSrc = node.attrib.get('MsgEvtSrc') 
    TrdID = node.attrib.get('TrdID') 
    LastQty = node.attrib.get('LastQty') 
    LastPx = node.attrib.get('LastPx') 
    TxnTm = node.attrib.get('TxnTm') 
    SettlCcy = node.attrib.get('SettlCcy') 
    SettlDt = node.attrib.get('SettlDt') 
    PxSubTyp = node.attrib.get('PxSubTyp') 
    VenueTyp = node.attrib.get('VenueTyp') 
    VenuTyp = node.attrib.get('VenuTyp') 
    OfstInst = node.attrib.get('OfstInst') 

    my_list.append[node.attrib.get('RptID')] 

    print RptID, TrdTyp, TrdSubTyp, TrdDt, BizDt, MLegRptTyp, MtchStat, MsgEvtSrc, TrdID, LastQty, LastPx, TxnTm, SettlCcy, SettlDt, PxSubTyp, VenueTyp, VenuTyp, OfstInst 

with open('/Users/anantsangar/Desktop/output.csv', 'w') as csvfile: 
    spamwriter = csv.writer(csvfile, delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL) 
    spamwriter.writerow(my_list) 

Ich kann nicht jeden Tag in das csv bekommen. Gibt es eine einfache Möglichkeit, dies in eine CSV-Datei zu exportieren?

Danke

+2

Was ist die erwartete Ausgabe? Es scheint, Sie interessieren sich nur für TrdCapRpt-Elemente, oder? –

+0

Nun, das Format dieses Stückes von xml ist ein bisschen hässlich..und ja, da es mehrere Arten von Elementen gibt, obwohl diese Daten in Attributen gehalten wurden, interessiert Sie nur diese TrdCaptRpt, klingt wie ein Trade Capital Report? –

+0

@JanVlcinsky ja TrdCapRpt aber auch PosRpt und Amt. –

Antwort

1

Verwenden csv.DictWriter, erhalten Werte von node.attrib Wörterbuch

Ihre Elemente genannt TrdCapRpt Attribute haben, wenn Sie einen solchen Knoten haben, sein Attribut node.attrib Enthält ein Wörterbuch mit Schlüssel/Wert für jedes Attribut.

csv.DictWriter ermöglicht das Schreiben von Daten aus dem Wörterbuch.

Zunächst einige Importe (ich verwende lxml immer, wie es ist sehr schnell und bietet zusätzliche Funktionen):

from lxml import etree 
import csv 

konfigurieren Dateinamen und Felder in jedem Datensatz zu verwenden:

xml_fname = "data.xml" 
csv_fname = "data.csv" 

fields = [ 
    "RptID", "TrdTyp", "TrdSubTyp", "ExecID", "TrdDt", "BizDt", "MLegRptTyp", 
    "MtchStat" "MsgEvtSrc", "TrdID", "LastQty", "LastPx", "TxnTm", "SettlCcy", 
    "SettlDt", "PxSubTyp", "VenueTyp", "VenuTyp", "OfstInst"] 

lesen XML:

xml = etree.parse(xml_fname) 

Iterate über Elemente "TrdCapRpt", schreiben die Attributwerte in CSV Datei:

with open(csv_fname, "w") as f: 

    writer = csv.DictWriter(f, fields, delimiter=";", extrasaction="ignore") 
    writer.writeheader() 
    for node in xml.iter("TrdCaptRpt"): 
     writer.writerow(node.attrib) 

Wenn Sie xml.etree.ElementTree mit stdlib bevorzugen, müssen Sie einfach verwalten, wie Sie jetzt tun, weil die node.attrib auch dort vorhanden ist.

aus mehreren Elementnamen Lesen

In Ihre Kommentare, bemerkt man, dass Sie mehrere Attribute von Elementnamen exportieren möchten. Dies ist auch möglich.

fields = [ 
    "elm_name", 

    "RptID", "TrdTyp", "TrdSubTyp", "ExecID", "TrdDt", "BizDt", "MLegRptTyp", 
    "MtchStat" "MsgEvtSrc", "TrdID", "LastQty", "LastPx", "TxnTm", "SettlCcy", 
    "SettlDt", "PxSubTyp", "VenueTyp", "VenuTyp", "OfstInst", 

    "Typ", "Amt", "Ccy" 
] 

xml = etree.parse(xml_fname) 

with open(csv_fname, "w") as f: 

    writer = csv.DictWriter(f, fields, delimiter=";", extrasaction="ignore") 
    writer.writeheader() 
    for node in xml.xpath("//*[self::TrdCaptRpt or self::PosRpt or self::Amt]"): 
     atts = node.attrib 
     atts["elm_name"] = node.tag 
     writer.writerow(node.attrib) 

Die Modifikationen sind: Um dies zu tun, werde ich das Beispiel Verwendung xpath und fügen zusätzliche Spalte "elm_name" zu verfolgen, von dem Element ist der Datensatz erstellt (die nur mit lxml arbeiten wahrscheinlich) ändern:

  • fields bekamen zusätzliches "elm_name" Feld und Felder von anderen Elementen (fühlen sich frei, die Sie nicht interessiert ist an zu entfernen).
  • iterieren über Elemente mit xml.xpath. Der XPath-Ausdruck ist komplexer, daher bin ich mir nicht sicher, ob stdlib ElementTree das unterstützt.
  • Bevor ich den Datensatz schreibe, füge ich den Namen des Elements in das Verzeichnis atts ein, um den Namen des Elements anzugeben.

Achtung: das Element Amt verschachtelt innerhalb PosRpt und diese Baumstruktur ist nicht möglich, in CSV zu unterstützen. Die Datensätze werden geschrieben, enthalten jedoch keine Informationen darüber, wo sie herkommen (abgesehen davon, dass sie dem Datensatz für das übergeordnete Element folgen).

+0

@Tezirg Lösung zum Lesen aus mehreren Elementnamen hinzugefügt. –

+0

das ist so hilfreich. Eine letzte Sache, wie würde ich den Header in der CSV-Datei bekommen? Also ich möchte alle Tags als Header haben und dann die Daten –

+0

@AnantSangar Eine Zeile mit 'writer.writeheader()' hinzugefügt. Der 'csv.DictWriter' ist wirklich schön gestaltet, oder? –

0

Sie zunächst jede Zeile mit allen Tags in einer Liste schieben sollte.

for node in tree.iter('TrdCaptRpt'): 

    ..... 

    my_list.push([RptID, TrdTyp, TrdSubTyp, TrdDt, BizDt, 
        MLegRptTyp, MtchStat, MsgEvtSrc, TrdID, 
        LastQty, LastPx, TxnTm, SettlCcy, SettlDt, 
        PxSubTyp, VenueTyp, VenuTyp, OfstInst]) 

dann jede Zeile schreiben in Datei:

with open('/Users/anantsangar/Desktop/output.csv', 'w') as csvfile: 
    spamwriter = csv.writer(csvfile, delimiter=' ', quotechar='|', quoting=csv.QUOTE_MINIMAL) 
for row in my_list: 
    spamwriter.writerow(row)