【问题标题】:Change file format using python [duplicate]使用python更改文件格式[重复]
【发布时间】:2021-05-31 19:21:45
【问题描述】:

请帮助我使用 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

【问题讨论】:

标签: python xml csv


【解决方案1】:

假设您发布的 XML 是“固定的”,一种方法是使用 BeautifulSoup 和 Python 内置的 csv 库,如下所示:

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 对象是从两个日期创建的,允许在输出时调整格式。

【讨论】:

  • 如果每个文件的列数不同,您能帮忙吗?在上述情况下,我们在 for 循环中对列标题和变量进行了硬编码,但这不适用于具有更多列数的另一个文件
  • 您能否edit 您的问题显示第二个XML 示例,它不起作用?这真的取决于结构是否相同。还要更新你想要的输出,这样我就可以看到你试图从每个中提取哪些项目。
猜你喜欢
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多