首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >读取熊猫/python的xls文件:不支持的格式,或损坏的文件:预期的BOF记录;找到b'\xef\xbb\xbf<?xml‘

读取熊猫/python的xls文件:不支持的格式,或损坏的文件:预期的BOF记录;找到b'\xef\xbb\xbf<?xml‘
EN

Stack Overflow用户
提问于 2022-02-02 11:05:58
回答 2查看 738关注 0票数 1

我正在尝试将一个xls文件(只有一个选项卡)打开到一个熊猫数据框中。

这是一个我通常可以在excel或excel中读取的文件,实际上这里是原始文件:https://www.dropbox.com/scl/fi/zbxg8ymjp8zxo6k4an4dj/product-screener.xls?dl=0&rlkey=3aw7whab78jeexbdkthkjzkmu

我注意到前两行合并了单元格,一些列也合并了。

我尝试过几种方法(从堆栈),但都失败了。

代码语言:javascript
运行
复制
# method 1 - read excel
file = "C:\\Users\\admin\\Downloads\\product-screener.xls"
df = pd.read_excel(file)
print(df)

错误:Excel file format cannot be determined, you must specify an engine manually.

代码语言:javascript
运行
复制
# method 2 - pip install xlrd and use engine
file = "C:\\Users\\admin\\Downloads\\product-screener.xls"
df = pd.read_excel(file, engine='xlrd')
print(df)

错误:Unsupported format, or corrupt file: Expected BOF record; found b'\xef\xbb\xbf<?xml'

代码语言:javascript
运行
复制
# method 3 - rename to xlsx and open with openpyxl
file = "C:\\Users\\admin\\Downloads\\product-screener.xlsx"
df = pd.read_excel(file, engine='openpyxl')
print(df)

错误:File is not a zip file (可能转换,而不是重命名,是一个选项)。

代码语言:javascript
运行
复制
# method 4 - use read_xml
file = "C:\\Users\\admin\\Downloads\\product-screener.xls"
df = pd.read_xml(file)
print(df)

这个方法实际上产生了一个结果,但是产生了一个与工作表无关的DataFrame。想必人们需要解释xml (似乎很复杂)?

代码语言:javascript
运行
复制
   Style       Name  Table
0    NaN       None    NaN
1    NaN  All funds    NaN


# method 5 - use read_table
file = "C:\\Users\\admin\\Downloads\\product-screener.xls"
df = pd.read_table(file)
print(df)

此方法将文件读入一个列(系列) DataFrame中。那么,如何使用这些信息创建与xls文件形状相同的标准2d DataFrame呢?

代码语言:javascript
运行
复制
0       <Workbook xmlns="urn:schemas-microsoft-com:off...
1                                                <Styles>
2                                 <Style ss:ID="Default">
3                          <Alignment Horizontal="Left"/>
4                                                </Style>
...                                                   ...
226532                                            </Cell>
226533                                             </Row>
226534                                           </Table>
226535                                       </Worksheet>
226536                                        </Workbook>



# method 5 - use read_html
file = "C:\\Users\\admin\\Downloads\\product-screener.xls"
df = pd.read_html(file)
print(df)

这将返回一个空列表[],而可能至少会有一个DataFrames列表。

因此,问题是,将该文件读取为dataframe (或类似的可用格式)的最简单方法是什么?

EN

Stack Overflow用户

回答已采纳

发布于 2022-02-02 15:36:45

不是一个完整的解决方案,但它应该让你开始。"xls"文件实际上是SpreadsheetML格式的普通xml文件。将文件扩展名更改为.xml --在internet浏览器中查看它,结构(至少是给定文件的结构)相当简单。

以下是将数据内容读入熊猫DataFrame中:

代码语言:javascript
运行
复制
import pandas as pd
import xml.etree.ElementTree as ET

tree = ET.parse('product-screener.xls')
root = tree.getroot()

data = [[c[0].text for c in r] for r in root[1][0][2:]]
types = [c[0].get('{urn:schemas-microsoft-com:office:spreadsheet}Type') for c in root[1][0][2]]

df = pd.DataFrame(data)
df = df.replace('-', None)
for c in df.columns:
    if types[c] == 'Number':
        df[c] = pd.to_numeric(df[c])
    elif types[c] == 'DateTime':
        df[c] = pd.to_datetime(df[c])

由于合并的单元格,从第0行和第1行获取列名会更复杂一些--我把它留给读者作为练习。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70954509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档