如何在Julia中读取gzip压缩的XLSX文件并转为DataFrame?
问题描述
我通过HTTP下载了一个gz压缩文件,其中包含xlsx格式的文件,目标是读取该文件并转换为DataFrame。我尝试了以下代码:
using HTTP, XLSX, DataFrames, GZip file = HTTP.get("http://www.tsetmc.com/tsev2/excel/IntraDayPrice.aspx?i=35425587644337450&m=30") write("c:/users/shayan/desktop/file.xlsx.gz", file.body); df = GZip.open("c:/users/shayan/desktop/file.xlsx.gz", "r") do io XLSX.readxlsx(io) end
运行后抛出MethodError错误,具体信息如下:
ERROR: MethodError: no method matching readxlsx(::GZipStream) Closest candidates are: readxlsx(::AbstractString) at C:\Users\Shayan\.julia\packages\XLSX\FFzH0\src\read.jl:37 Stacktrace: [1] (::var"#23#24")(io::GZipStream) @ Main c:\Users\Shayan\Documents\Python Scripts\test.jl:15 [2] gzopen(::var"#23#24", ::String, ::String) @ GZip C:\Users\Shayan\.julia\packages\GZip\JNmGn\src\GZip.jl:269 [3] open(::Function, ::Vararg{Any}) @ GZip C:\Users\Shayan\.julia\packages\GZip\JNmGn\src\GZip.jl:265 [4] top-level scope @ c:\Users\Shayan\Documents\Python Scripts\test.jl:14
解决方法
报错核心原因是XLSX.readxlsx仅支持传入文件路径(AbstractString类型),不直接兼容GZipStream类型的IO流。以下是两种可行的解决方式:
方法1:内存中直接处理(无需写入本地文件)
using HTTP, XLSX, DataFrames, GZip # 获取压缩响应数据 response = HTTP.get("http://www.tsetmc.com/tsev2/excel/IntraDayPrice.aspx?i=35425587644337450&m=30") # 解压后读取为XLSX文件对象 xlsx_file = GZip.open(IOBuffer(response.body), "r") do gz_io # 将解压后的字节数据包装为标准IO流,供XLSX读取 XLSX.readxlsx(IOBuffer(read(gz_io))) end # 将第一个工作表转换为DataFrame(可根据实际情况修改工作表索引/名称) df = DataFrame(xlsx_file[1][:])
方法2:先解压到本地文件再读取
如果需要保留本地文件副本,可以先解压出完整的xlsx文件再处理:
using HTTP, XLSX, DataFrames, GZip response = HTTP.get("http://www.tsetmc.com/tsev2/excel/IntraDayPrice.aspx?i=35425587644337450&m=30") write("c:/users/shayan/desktop/file.xlsx.gz", response.body) # 解压gz文件到xlsx格式 GZip.open("c:/users/shayan/desktop/file.xlsx.gz", "r") do gz_io write("c:/users/shayan/desktop/file.xlsx", read(gz_io)) end # 读取xlsx文件并转换为DataFrame xlsx_file = XLSX.readxlsx("c:/users/shayan/desktop/file.xlsx") df = DataFrame(xlsx_file[1][:])
内容的提问来源于stack exchange,提问作者Shayan
相关产品推荐
相关产品推荐

