本文目录导读:

是的,完全可以通过脚本自动清洗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(更轻量)即可,如果需要针对特定业务规则(如日期格式化、数字范围校验)定制,只需在脚本中添加相应判断语句。