请帮我用python把下面的xml文件转换成csv格式。
我得到一个xml文件像下面的格式像excel。但是,我想把它转换成csv格式。
我的原始文件有更多的列和行数。每个文件的列数或多或少是不同的。我无法在这里粘贴整个代码。但是,下面是xml中表、行和列的定义。
<Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="3" x:FullColumns="1"
x:FullRows="1" ss:DefaultRowHeight="15">
<Column ss:Width="57.5"/>
<Column ss:Width="49.5"/>
<Row ss:Height="14.5">
<Cell><Data ss:Type="String">Date</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
<Cell><Data ss:Type="String">Time</Data><NamedCell ss:Name="_FilterDatabase"/></Cell>
<Cell><Data ss:Type="String">Language</Data><NamedCell
ss:Name="_FilterDatabase"/></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s62"><Data ss:Type="DateTime">2021-02-15T00:00:00.000</Data><NamedCell
ss:Name="_FilterDatabase"/></Cell>
<Cell ss:StyleID="s63"><Data ss:Type="DateTime">1899-12-31T22:46:17.000</Data><NamedCell
ss:Name="_FilterDatabase"/></Cell>
<Cell><Data ss:Type="String">Norwegian</Data><NamedCell
ss:Name="_FilterDatabase"/></Cell>
</Row>
<Row ss:AutoFitHeight="0">
<Cell ss:StyleID="s62"><Data ss:Type="DateTime">2021-02-15T00:00:00.000</Data><NamedCell
ss:Name="_FilterDatabase"/></Cell>
<Cell ss:StyleID="s63"><Data ss:Type="DateTime">1899-12-31T22:23:34.000</Data><NamedCell
ss:Name="_FilterDatabase"/></Cell>
<Cell><Data ss:Type="String">Norwegian</Data><NamedCell
ss:Name="_FilterDatabase"/></Cell>
</Row>
</Table>
我的预期输出如下:
Date,Time,Language
2/15/2021,22:46,Norwegian
2/15/2021,22:23,Norwegian
假设您发布的XML是"固定的",一种方法是使用BeautifulSoup
和内置的Pythoncsv
库,如下所示:
from datetime import datetime
from bs4 import BeautifulSoup
import csv
with open('input.xml') as f_xml:
xml = f_xml.read()
soup = BeautifulSoup(xml, "lxml")
with open('output.csv', 'w', newline='') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(['Date', 'Time', 'Language'])
for row in soup.find_all('row')[1:]:
cells = row.find_all('cell')
date1 = datetime.strptime(cells[0].data.text, '%Y-%m-%dT%H:%M:%S.%f')
date2 = datetime.strptime(cells[1].data.text, '%Y-%m-%dT%H:%M:%S.%f')
language = cells[2].data.text
csv_output.writerow([date1.strftime('%m/%d/%Y'), date2.strftime('%H:%M'), language])
输出如下:
Date,Time,Language
02/15/2021,22:46,Norwegian
02/15/2021,22:23,Norwegian
这首先找到所有的row
元素,然后提取细胞元素。datetime
对象是从两个日期创建的,允许在输出时调整格式。