繁体   English   中英

在python中读取包含xml数据的xls文件

[英]Read xls file containing xml data in python

一个 xls 文件里面有 xml 数据。 文件的顶部如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40">
<Styles>
<Style ss:ID="sDT"><NumberFormat ss:Format="Short Date"/></Style>
</Styles>
<Worksheet ss:Name="XXX">
    <Table>
        <Row>
            <Cell><Data ss:Type="String">Request ID</Data></Cell>
            <Cell><Data ss:Type="String">Date</Data></Cell>
            <Cell><Data ss:Type="String">XXX ID</Data></Cell>
            <Cell><Data ss:Type="String">Customer Name</Data></Cell>
            <Cell><Data ss:Type="String">Amount</Data></Cell>
            <Cell><Data ss:Type="String">Requested Action</Data></Cell>
            <Cell><Data ss:Type="String">Status</Data></Cell>
            <Cell><Data ss:Type="String">Transaction ID</Data></Cell>
            <Cell><Data ss:Type="String">Merchant UTR</Data></Cell>
        </Row>

如何使用 pandas.read_xml 将其读入 Pandas DataFrame。 (将它读入 DataFrame 的任何其他方式也可以。)

注意:已经尝试过使用 read_excel 的各种解决方案,无论是否使用引擎 =“openpyxl”。 显示不同的错误。 (请参阅下面的评论。评论还包含指向其他人之前面临的相同问题的链接。)

您的文件是有效的 xml 文件。 我知道除了 Excel 之外没有自动转换器,但它可以很容易地被解析为一个纯 xml 文件,例如使用 BeautifulSoul。

如果内部格式足够简单,您可以处理Worksheetrowcell标签以将其转换为 csv 文件:

from bs4 import BeautifulSoup
import csv
import io

soup = BeautifulSoup(open('file.xxx'))
    
with open('file.csv', newline='') as fdout:
    wr = csv.writer(fdout)
    sheet = soup.find('worksheet')
    for row in sheet.findAll('row'):
        wr.writerow(cell.text for cell in row.findAll('cell'))

使用您的示例数据,它按预期给出:

Request ID,Date,XXX ID,Customer Name,Amount,Requested Action,Status,Transaction ID,Merchant UTR

尝试定义另一个引擎:

df = pd.read_excel('test.xls', engine='xlrd')

请注意,您需要安装xlrd库,例如:

pip install xlrd

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM