Julia使用Downloads下载CSV报ArgumentError:Symbol名称不得包含\0错误
解决方案
根因说明
你遇到的两个报错本质是该站点默认对请求返回gzip压缩后的响应,且未正确设置Content-Encoding响应头,导致Julia的Downloads库无法识别并自动解压,你通过Downloads.download拿到的文件实际是gzip压缩包,不是纯文本CSV,因此直接读取会出现空字符、无效UTF-8字符串的报错。手动下载时浏览器会自动完成gzip解压,所以本地读取完全正常。
修复方案
方案1:添加请求头要求服务端返回未压缩内容
直接在下载时指定Accept-Encoding: identity头,告知服务端不要返回压缩内容,不需要额外依赖即可解决:
using Downloads, CSV, DataFrames url = "https://r-data.pmagunia.com/system/files/datasets/dataset-85141.csv" # 新增请求头要求非压缩响应 f = Downloads.download(url; headers = ["Accept-Encoding" => "identity"]) df = CSV.read(f, DataFrame) # 如果列名仍有特殊字符,可添加normalizenames参数: # df = CSV.read(f, DataFrame; normalizenames=true)
方案2:手动解压下载的压缩内容
如果不方便修改请求头,可以引入CodecZlib库手动解压下载到的压缩内容,也可以直接读取流式内容不需要落地存储:
using Downloads, CSV, DataFrames, CodecZlib url = "https://r-data.pmagunia.com/system/files/datasets/dataset-85141.csv" # 直接读取流式响应并解压 stream = Downloads.download(url, IOBuffer()) seekstart(stream) df = CSV.read(GzipDecompressorStream(stream), DataFrame)
内容的提问来源于stack exchange,提问作者Gustavo Machala
相关产品推荐
相关产品推荐

