2015-10-23 64 views
1

我有下面的XML文件( 'registerreads_EE.xml'):的Python ElementTree的XML輸出爲csv

<?xml version="1.0" encoding="us-ascii" standalone="yes"?> 
<ReadingDocument xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<ReadingStatusRefTable> 
<ReadingStatusRef Ref="1"> 
    <UnencodedStatus SourceValidation="SIMPLE"> 
    <StatusCodes> 
     <Signal>XX</Signal> 
    </StatusCodes> 
    </UnencodedStatus> 
</ReadingStatusRef> 
    </ReadingStatusRefTable> 
    <Header> 
<IEE_System Id="XXXXXXXXXXXXXXX" /> 
<Creation_Datetime Datetime="2015-10-22T09:05:32Z" /> 
<Timezone Id="UTC" /> 
<Path FilePath="X:\XXXXXXXXXXXX.xml" /> 
<Export_Template Id="XXXXX" /> 
<CorrelationID Id="" /> 
    </Header> 
    <ImportExportParameters ResubmitFile="false" CreateGroup="true"> 
    <DataFormat TimestampType="XXXXXX" Type="XXXX" /> 
    </ImportExportParameters> 
    <Channels> 
<Channel StartDate="2015-10-21T00:00:00-05:00" EndDate="2015-10-22T00:00:00-05:00"> 
    <ChannelID ServicePointChannelID="73825603:301" /> 
    <Readings> 
    <Reading Value="3577.0" ReadingTime="2015-10-21T00:00:00-05:00" StatusRef="1" /> 
    <Reading Value="3601.3" ReadingTime="2015-10-22T00:00:00-05:00" StatusRef="1" /> 
    </Readings> 
    <ExportRequest RequestID="152" EntityType="ServicePoint" EntityID="73825603" RequestSource="Scheduled" /> 
</Channel> 
    <Channel StartDate="2015-10-21T00:00:00-05:00" EndDate="2015-10-22T00:00:00-05:00"> 
    <ChannelID ServicePointChannelID="73825604:301" /> 
    <Readings> 
    <Reading Value="3462.5" ReadingTime="2015-10-21T00:00:00-05:00" StatusRef="1" /> 
    <Reading Value="3501.5" ReadingTime="2015-10-22T00:00:00-05:00" StatusRef="1" /> 
    </Readings> 
    <ExportRequest RequestID="152" EntityType="ServicePoint" EntityID="73825604" RequestSource="Scheduled" /> 
</Channel> 
    </Channels> 
</ReadingDocument> 

我想信道的數據的XML解析成csv文件。

他是我所用Python編寫的2.7.10:

import xml.etree.ElementTree as ET 

tree = ET.parse('registerreads_EE.xml') 

root = tree.getroot()[3] 

for channel in tree.iter('Channel'): 
    for exportrequest in channel.iter('ExportRequest'): 
     entityid = exportrequest.attrib.get('EntityID') 
     for meterread in channel.iter('Reading'): 
      read = meterread.attrib.get('Value') 
      date = meterread.attrib.get('ReadingTime') 
      print read[:-2],",",date[:10],",",entityid 

tree.write(open('registerreads_EE.csv','w')) 

這裏是上述程序運行時的屏幕輸出:

3577 , 2015-10-21 , 73825603 
3601 , 2015-10-22 , 73825603 
3462 , 2015-10-21 , 73825604 
3501 , 2015-10-22 , 73825604 

的 'registerreads.csv' 輸出文件像原始的XML文件,減去第一行。

我想將上面的打印輸出輸出到帶有read,date,entityid標頭的csv文件。

我對此有困難。這是我的第一個Python程序。任何幫助表示讚賞。

回答

1

使用csv模塊而不是lxml模塊將行寫入csv文件。但仍然使用lxml解析並從xml文件中提取內容:

import xml.etree.ElementTree as ET 
import csv 

tree = ET.parse('registerreads_EE.xml') 

root = tree.getroot()[3] 

with open('registerreads_EE.csv', 'w', newline='') as r: 
    writer = csv.writer(r) 
    writer.writerow(['read', 'date', 'entityid']) # WRITING HEADERS 

    for channel in tree.iter('Channel'): 
     for exportrequest in channel.iter('ExportRequest'): 
      entityid = exportrequest.attrib.get('EntityID') 
      for meterread in channel.iter('Reading'): 
       read = meterread.attrib.get('Value') 
       date = meterread.attrib.get('ReadingTime')  

       # WRITE EACH ROW ITERATIVELY 
       writer.writerow([read[:-2],date[:10],entityid])