实用脚本能批量清洗吗?

wen 实用脚本 15

本文目录导读:

实用脚本能批量清洗吗?

  1. 常见场景与对应脚本方案
  2. 实用建议:如何写出“真能干活”的清洗脚本?

“实用脚本能批量清洗吗?”——答案是:能,而且这正是脚本的核心优势之一。

脚本(尤其是 Python、Shell、SQL 脚本)非常适合处理重复、量大、格式杂乱的数据,所谓“批量清洗”,通常是指对多个文件(如 CSV、Excel、日志、JSON)或多个数据条目(去重、空值填充、格式转换、正则替换)执行统一的处理。

常见场景与对应脚本方案

为了给你一个直观的答案,我列举几个最常用的“实用脚本批量清洗”场景,你可以直接复制思路:

CSV/Excel 文件批量清洗(Python + Pandas)

这是数据分析和数据工程最常见的需求,一个脚本可以处理文件夹下几百个 CSVs,或一个大型 Excel 的多个 Sheet。

场景:文件夹 raw_data/ 内有 100 个 *.csv,需要删除空行、统一列名、转换日期格式,并输出到 cleaned/ 文件夹。

import pandas as pd
import glob
import os
input_folder = 'raw_data'
output_folder = 'cleaned'
os.makedirs(output_folder, exist_ok=True)
# 批量处理所有 CSV 文件
for file in glob.glob(os.path.join(input_folder, '*.csv')):
    df = pd.read_csv(file)
    # ---------- 批量清洗逻辑 ----------
    df.dropna(how='all', inplace=True)              # 删除全空行
    df.columns = [col.strip().lower() for col in df.columns]  # 统一列名大小写
    if 'date' in df.columns:
        df['date'] = pd.to_datetime(df['date'], errors='coerce')  # 日期标准化
    # 其他清洗:去重、填充、格式转换等
    # ---------------------------------
    out_name = os.path.join(output_folder, os.path.basename(file))
    df.to_csv(out_name, index=False)
    print(f'Cleaned: {file} -> {out_name}')
print("所有文件清洗完成!")

优点:Powerful,几乎能处理任何结构化或半结构化数据(含有混合类型、乱码、多余空格等)。

文本/日志文件批量清洗(Shell + sed/awk)

适合纯文本、CSV、日志文件,不需要安装 Python,Linux/Mac 原生支持,Windows 可用 Git Bash 或 WSL。

场景:批量移除日志中的 IP 地址、删除空行、统一换行符。

# 批量处理当前目录下所有 .log 文件,输出到 cleaned/ 文件夹
mkdir -p cleaned
for file in *.log; do
    # 删除空行、删除包含“ERROR”的行、删除IP地址
    sed -e '/^$/d' -e '/ERROR/d' -e 's/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/[REMOVED]/g' \
        "$file" > "cleaned/$file"
    echo "Cleaned: $file"
done

优点:极轻量、速度快,适合 GB 级的大文件。

数据库批量数据清洗(SQL UPDATE/CTE)

如果数据已经导入数据库(MySQL、PostgreSQL、SQLite),一句 SQL 脚本可以更新或清洗全表数百万条记录。

场景:将 users 表中所有电话号码格式统一(去除横线和空格),修复异常值。

-- 批量清洗:去掉电话号码中的横线、空格、括号
UPDATE users
SET phone_number = REGEXP_REPLACE(phone_number, '[^0-9]', '', 'g')
WHERE phone_number IS NOT NULL;
-- 批量清洗:将空字符串转为 NULL
UPDATE users SET email = NULL WHERE email = '';
-- 批量清洗:将状态字段标准化
UPDATE products SET status = 'active' WHERE status IN ('Active', '1', 'true');

优点:直接在原库清洗,不需要导出导入,避免内存溢出。

图像/文件元数据批量清洗(Python + PIL/ExifTool)

不止是文本,脚本也可以批量处理图片:统一尺寸、调整色彩、去除 EXIF 信息、重命名。

场景:批量压缩文件夹中的所有 .jpg 并统一命名为 img_001.jpg 格式。

from PIL import Image
import os, glob
for i, file in enumerate(sorted(glob.glob('photos/*.jpg')), 1):
    img = Image.open(file)
    img = img.convert('RGB')                     # 统一色彩模式
    img = img.resize((1024, 768))               # 统一尺寸
    img.save(f'cleaned/img_{i:03d}.jpg', quality=85)  # 批量压缩输出

实用建议:如何写出“真能干活”的清洗脚本?

  1. 先小后大:先用 1-3 个文件测试清洗逻辑,确认无误后再跑全量。
  2. 保留原始副本:脚本不要直接覆盖原始文件,输出到 cleaned/_output/ 文件夹。
  3. 处理异常:数据清洗中一定会遇到脏数据(乱码、类型错误、空值),脚本中加入 try/excepterrors='coerce' 参数,避免整个流程崩掉。
  4. 记录日志:简单脚本可以加 print,复杂任务建议写入 log 文件,记录清洗失败的文件和原因。
  5. 善用正则表达式:80% 的文本清洗问题,一个正则就能解决(比如去除 HTML 标签、提取数字、替换 Unicode 字符)。

实用脚本绝对可以批量清洗,而且这才是脚本的真正威力所在。 现实中常见的数据清洗(如去掉数千个文件的多余空行、统一几百个 Excel 的时间格式、修正百万行数据库的编码问题)如果在 GUI 里手动做,会非常痛苦,而用脚本只需几行代码几秒钟就完成高效批量处理。

如果你有具体的清洗需求(“我有一个文件夹里全是乱码的 CSV 文件,要清洗成标准格式”),请告诉我文件类型、具体清洗规则,我可以给你写一个可直接运行的脚本模板。

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