实用脚本能自动清洗CSV数据吗?

wen 实用脚本 4

本文目录导读:

实用脚本能自动清洗CSV数据吗?

  1. Python + Pandas 一键清洗脚本
  2. 更轻量的 Shell 脚本(适合Linux/Mac)
  3. 高性能方案:用于10GB+超大CSV
  4. 总结建议

是的,完全可以通过脚本自动清洗CSV数据,常用的工具包括 Python(pandas)Shell(awk/sed)R 等,以下是一个实用且可直接运行的Python脚本示例,能自动处理常见的CSV脏数据问题(如空值、重复、格式错误等)。


Python + Pandas 一键清洗脚本

import pandas as pd
import numpy as np
import sys
def auto_clean_csv(input_file, output_file=None):
    """
    自动清洗CSV:去除空行、统一空值、去重、修正数值格式、删除全空列
    """
    try:
        # 1. 读取CSV(自动识别编码,常见问题:gbk或utf-8)
        encodings = ['utf-8', 'gbk', 'gb2312', 'latin1']
        df = None
        for enc in encodings:
            try:
                df = pd.read_csv(input_file, encoding=enc, dtype=str, keep_default_na=False)
                break
            except UnicodeDecodeError:
                continue
        if df is None:
            raise ValueError("无法识别文件编码")
        # 2. 去除完全空的行(所有列都是空白)
        df = df.dropna(how='all')
        # 去除完全重复的行
        df = df.drop_duplicates()
        # 3. 统一各种空值表示 -> None,然后填充默认值
        na_values = ['', 'null', 'NULL', 'NaN', 'N/A', 'None', 'nan', '?', '-']
        df.replace(na_values, np.nan, inplace=True)
        # 4. 自动填充关键字段:如日期或数值列,可根据业务需要调整
        # 这里简单填充:字符串列填充'未知',数值列填充0
        for col in df.columns:
            if df[col].dtype == 'object':
                # 尝试转换为数字(如价格、数量)
                try:
                    numeric_series = pd.to_numeric(df[col], errors='coerce')
                    if numeric_series.notna().sum() > 0.5 * len(df):  # 超过一半是数字
                        df[col] = numeric_series.fillna(0)
                except:
                    pass
                # 字符串列填充默认值
                df[col].fillna('未知', inplace=True)
            elif np.issubdtype(df[col].dtype, np.number):
                df[col].fillna(0, inplace=True)
        # 5. 删除全部为空或全部相同的列(可选)
        # df = df.dropna(axis=1, how='all')
        # 6. 重置索引
        df.reset_index(drop=True, inplace=True)
        # 输出清洗后的数据
        if output_file is None:
            output_file = input_file.rsplit('.', 1)[0] + '_clean.csv'
        df.to_csv(output_file, index=False, encoding='utf-8-sig')  # 带BOM兼容Excel
        print(f"✅ 清洗完成!原文件:{input_file}")
        print(f"  输出文件:{output_file}")
        print(f"  原始行数:{len(pd.read_csv(input_file, nrows=1))}  → 清洗后行数:{len(df)}")
        return True
    except Exception as e:
        print(f"❌ 清洗失败:{e}")
        return False
if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("用法:python csv_cleaner.py <输入CSV> [输出CSV]")
    else:
        input_path = sys.argv[1]
        output_path = sys.argv[2] if len(sys.argv) > 2 else None
        auto_clean_csv(input_path, output_path)

使用方法

# 安装依赖(仅首次)
pip install pandas numpy
# 自动清洗,输出到同目录下 *_clean.csv
python csv_cleaner.py 销售数据.csv
# 或指定输出文件
python csv_cleaner.py messy.csv clean_data.csv

自动处理的问题

问题类型 处理方式
空行 整行删除
重复行 保留第一条
多种空值表示 统一为NaN,数字列填0,文本列填'未知'
编码混乱 自动尝试 utf-8/gbk
混入文本的数字列 自动转换为数字,无法转换的填0
全空列 可选删除

更轻量的 Shell 脚本(适合Linux/Mac)

如果你更习惯命令行,也可以用 awk + sed 快速处理:

#!/bin/bash
# 使用: bash clean_csv.sh input.csv > output.csv
awk -F',' '
BEGIN {OFS=","}
NR==1 {print; next}  # 保留表头
{
    # 跳过全空行
    if (NF == 0) next
    # 替换常见空值
    for(i=1; i<=NF; i++) {
        if ($i ~ /^(NULL|null|N\/A|na|nan|\\?|-| )$/) $i="0"
        # 去除两端空格
        gsub(/^[[:space:]]+|[[:space:]]+$/, "", $i)
    }
    # 去重(使用数组记录,需注意内存,大文件不推荐)
    # if (!seen[$0]++) print
    print
}' "$1" | sort -u -t','  # 简单去重

局限性:Shell脚本对大文件处理更快(awk流式),但缺少类型推断和高级逻辑。


高性能方案:用于10GB+超大CSV

对于超大文件,建议使用 pandas 分块读取:

chunk_size = 100000  # 每10万行处理一次
chunks = pd.read_csv('huge.csv', chunksize=chunk_size, encoding='utf-8')
output_chunks = []
for chunk in chunks:
    # 在这里做清洗(同上逻辑)
    chunk = chunk.dropna(how='all').drop_duplicates()
    output_chunks.append(chunk)
pd.concat(output_chunks).to_csv('huge_clean.csv', index=False)

或使用 csvkit 工具(命令行,Python实现):

pip install csvkit
csvclean 数据.csv          # 自动修复并生成 *_out.csv
csvstat 数据.csv           # 统计列信息

总结建议

场景 推荐方案
单次小文件(<100MB) Python pandas 脚本(完整逻辑)
快速查看/服务器环境 Shell awk/sed(无依赖)
超大文件(>1GB) pandas分块 或 csvkit
需要可视化报表 结合 pandas-profiling 生成质量报告

核心结论:脚本完全可以自动清洗CSV,且非常实用,你只需要根据自己的技术水平选择Python(更全面)或Shell(更轻量)即可,如果需要针对特定业务规则(如日期格式化、数字范围校验)定制,只需在脚本中添加相应判断语句。

抱歉,评论功能暂时关闭!