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
相关产品推荐
相关产品推荐

