You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python:urllib读取.xlsx文件行数异常的解决咨询

解决XLSX文件行数读取错误的问题

你遇到的问题根源在于:XLSX不是纯文本格式的文件,它本质是一个包含XML结构的ZIP压缩包。你用urllib.urlopen().readlines()读取到的"行数",只是二进制文件中被换行符分隔的块数,和表格里实际的数据记录数完全无关——这就是为什么CSV能得到正确结果(CSV是纯文本),但XLSX不行的原因。

下面给你两种可靠的解决方案,都是用专门处理Excel的库来实现:

方案1:用Pandas(最简单快捷)

Pandas是数据处理的常用库,能轻松解析Excel文件,一行代码就能搞定行数统计:

首先安装依赖(如果还没装的话):

pip install pandas openpyxl

然后编写代码:

import pandas as pd

file_url = 'http://127.0.0.1:8000/media/temp/aggregate_bill_export_20180427055420580970.xlsx'
# 读取Excel文件,默认读取第一个工作表
df = pd.read_excel(file_url)
# len(df)就是数据的行数(Pandas会把表头作为列名,df中存储的是实际数据行)
total_records = len(df)
print(total_records)

如果你的Excel表头有多行,可以通过header参数指定,比如pd.read_excel(file_url, header=0)表示第一行是表头,这样len(df)依然是正确的数据行数。

方案2:用OpenPyXL(轻量,适合仅需行数的场景)

如果你不想引入Pandas这么大的库,可以用OpenPyXL,它专门处理XLSX文件,更轻量化:

先安装依赖:

pip install openpyxl

然后编写代码:

import urllib
from openpyxl import load_workbook
from io import BytesIO

file_url = 'http://127.0.0.1:8000/media/temp/aggregate_bill_export_20180427055420580970.xlsx'
# 获取文件的二进制内容
meta = urllib.urlopen(file_url)
# 把二进制内容转为BytesIO对象,让OpenPyXL可以读取
wb = load_workbook(filename=BytesIO(meta.read()), read_only=True)  # read_only=True提升大文件读取效率
ws = wb.active  # 获取当前活动的工作表(一般是第一个)
# 如果需要指定工作表,可以用wb['工作表名称'],比如wb['Sheet1']

# ws.max_row是整个工作表的最大行号,减去1是去掉表头行(如果你的Excel有表头的话)
total_records = ws.max_row - 1
print(total_records)

如果你的Excel没有表头,直接用ws.max_row就是实际数据行数。

关键提醒

永远不要用处理纯文本的方式(比如readlines())去读取二进制格式的文件(XLSX、DOCX、PDF等),必须使用对应格式的专用解析库,才能得到正确的内容。

内容的提问来源于stack exchange,提问作者Avinash Mishra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:58:53