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

将多个csv.gz文件读入Dask DataFrame时遇EmptyDataError求助

解决Dask读取csv.gz文件时的EmptyDataError问题

第一步:排查空文件或无效文件

EmptyDataError的核心原因是某个目标文件没有可解析的内容——要么是文件大小为0的空文件,要么是文件内容完全不符合CSV格式(比如既无表头也无数据行)。可以用以下代码快速定位这类文件:

import os
import glob

file_paths = glob.glob(file_pattern)
# 筛选出大小为0的空文件
empty_files = [fn for fn in file_paths if os.path.getsize(fn) == 0]
if empty_files:
    print("检测到空文件:", empty_files)

第二步:简化读取代码(无需手动用delayed循环)

你当前代码里定义了@delayed装饰的read_csv函数但未实际使用,反而手动循环调用delayed(pd.read_csv),这完全没必要——Dask的dd.read_csv本身就支持直接读取多个文件(支持通配符或文件列表),且会自动处理并行逻辑,代码可以简化为:

import dask.dataframe as dd

file_paths = glob.glob(file_pattern)
# 直接读取所有gzip压缩的CSV文件
df = dd.read_csv(file_paths, compression='gzip', dtype=None, blocksize=None)

第三步:跳过或过滤有问题的文件

如果确实存在个别损坏/空文件,可以通过两种方式处理:

  1. 读取时自动跳过错误文件/行(新版本Dask用on_bad_lines='skip',旧版本用error_bad_lines=False):
df = dd.read_csv(file_paths, compression='gzip', dtype=None, blocksize=None, on_bad_lines='skip')
  1. 手动过滤掉空文件后再读取:
valid_files = [fn for fn in file_paths if os.path.getsize(fn) > 0]
df = dd.read_csv(valid_files, compression='gzip', dtype=None, blocksize=None)

第四步:精准定位出错文件

如果以上方法仍未解决问题,可以逐个读取文件排查,找到具体出错的文件:

import pandas as pd

for fn in file_paths:
    try:
        pd.read_csv(fn, compression='gzip')
        print(f"文件 {fn} 读取正常")
    except Exception as e:
        print(f"文件 {fn} 读取失败:{str(e)}")

找到出错文件后,可针对性删除空文件、修复损坏文件或单独跳过该文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 08:49:59