Data Processing (数据处理)
下面是一份 最完整、最系统、最实用的「Python 数据处理操作大全」总结,涵盖 所有常见数据类型、数据结构、数据来源、数据转换方式,非常适合作为你个人的“数据处理速查表”。
内容结构按场景分类,非常清晰。
目录总览(所有分类)
- 字符串处理(String Processing)
- 数字处理(Number Processing)
- 布尔处理(Boolean Processing)
- 日期与时间处理(Datetime Processing)
- 列表处理(List Processing)
- 元组处理(Tuple Processing)
- 集合处理(Set Processing)
- 字典处理(Dict Processing)
- JSON / TOML / YAML 数据处理
- 正则表达式处理(Regex Processing)
- 文件处理(File Processing)
- 数据校验与清洗(Validation / Cleaning)
- 类型处理与转换
- 数据序列化与反序列化(序列 -> 字节 / 文件)
- 数据库数据处理(DB -> Python -> DB)
- 网络数据处理(HTTP Response 数据)
- 性能优化相关的数据处理
| 类型 | 说明 | 示例 |
|---|---|---|
| 去前后空白 | strip() / lstrip() / rstrip() | " abc “.strip() |
| 大小写转换 | lower() / upper() / title() | “Hello”.lower() |
| 查找 / 替换 | find / replace | “abc”.replace(“b”, “”) |
| 字符串拼接 | + / join | “a” + “b” / “.".join(list) |
| 分割 | split / rsplit | “a,b”.split(”,”) |
| 判断前缀 | startswith | “abc”.startswith(“a”) |
| 判断后缀 | endswith | “abc”.endswith(“c”) |
| 模板替换 | f-string | f"{name}-{age}" |
| 正则拆分 | re.split | re.split(r"\W+", s) |
| 格式化 | format / f-string | f"{num:02d}" |
| 清洗特殊字符 | re.sub | re.sub(r"\s+", " “, s) |
| 提取数字 | 正则 | re.findall(r”\d+", s) |
| 类型 | 说明 |
|---|---|
| 四舍五入 round() | |
| 转换类型 int() / float() / Decimal() | |
| 加减乘除 | |
| 精度运算 Decimal | |
| 分数计算 Fraction | |
| 比较大小 | |
| 判断是否为数字(regex / str.isdigit) | |
| 科学计数法转换 |
常用于判断:
- 是否为空: if not a:
- 多条件判断: a and b
- 任意为真: any(list)
- 所有为真: all(list)
- 三元表达式:x if cond else y
| 功能 | 示例 |
|---|---|
| 获取当前时间 | datetime.now() |
| 时间戳转换 | datetime.fromtimestamp(ts) |
| 时间格式化 | dt.strftime("%Y-%m-%d") |
| 字符串 -> datetime | datetime.strptime() |
| 时区转换 | dt.astimezone(tz) |
| 日期加减 | dt + timedelta(days=1) |
| 判断是否当天 | dt.date() == date.today() |
| 任意格式转换 | “2025年12月04日”.replace(“年”,"-")… |
| 类型 | 说明 |
|---|---|
| append / extend | |
| insert / remove | |
| 列表推导式 | |
| map / filter | |
| 切片 slicing | |
| 排序 sort / sorted | |
| 去重(转 set) | |
| 分组(chunks) | |
| flatten(扁平化) | |
| list -> dict |
- 不可变序列
- 多值返回
- 解包:a, b = (1, 2)
- 命名元组:collections.namedtuple
- 去重
- 并集:set1 | set2
- 交集:set1 & set2
- 差集:set1 - set2
- 成员检查:in
| 功能 | 示例 |
|---|---|
| 键值获取 | dict.get() |
| 遍历 | items() / keys() / values() |
| 合并 | `d1 |
| 删除字段 | pop |
| 过滤字段 | 字典推导式 |
| rename key | {new: d[old]} |
| 嵌套 dict 处理 | 递归 |
| flatten dict | 展开嵌套结构 |
| 功能 | 工具 |
|---|---|
| json.dumps / loads | 内置 JSON |
| orjson.dumps / loads | 最快 JSON |
| tomllib.loads | Python 3.11+ |
| yaml.safe_load | PyYAML |
常见操作:
- 匹配:re.match
- 搜索:re.search
- 替换:re.sub
- 提取:re.findall
- 分组:re.group
- 分割:re.split
| 操作 | 示例 |
|---|---|
| 文件读取 | open(…).read() |
| 逐行读取 | for line in f: |
| 写入 / 追加 | write / append |
| JSON 文件 | json.dump / load |
| CSV 文件 | csv.reader |
| 二进制文件 | rb / wb |
- 清洗空字符串
- 去除 None
- 校验类型(isinstance)
- 校验格式(regex)
- 必填字段检查
- 数字范围判断
| 类型 | 方法 |
|---|---|
| str ↔ int | int(“3”), str(3) |
| str ↔ float | float(“1.2”) |
| str ↔ dict | json.loads |
| list ↔ tuple | list(), tuple() |
| datetime ↔ str | strptime / strftime |
| bytes ↔ str | decode / encode |
- JSON
- Pickle(序列化对象)
- orjson(二进制 JSON)
- msgpack(高性能二进制)
| 功能 | 说明 |
|---|---|
| ORM DataClass 转 dict | model.dict |
| SQLAlchemy result -> dict | |
| datetime 转字符串 | |
| 数据分页 limit/offset | |
| 批量插入转换 | |
| 字段类型检查 |
- response.json()
- 失败重试策略
- 字符集处理 encoding
- headers 拼接
- URL 参数拼装
- 提取 query 参数
- lru_cache 加速
- orjson 加速 JSON 解析
- multiprocessing 并行处理
- itertools 惰性处理大数据
- 类型转换
- 正则处理
- 字符串处理
- 日期时间处理
- 集合 / 列表 / 字典处理
- I/O 文件 / JSON
- 数据校验与清洗
下面是一份 高质量、可用于项目规范的《Python 数据处理最佳实践》。
涵盖 字符串 / 数字 / 日期 / 列表 / 字典 / JSON / 数据清洗 / 校验 / 类型转换 / 文件处理 / 代码规范 等全套内容。
内容聚焦 实战、可落地、项目级最佳实践,不是泛泛而谈。
📌 目录
- 通用原则
- 字符串处理
- 数字处理
- 日期与时间
- 列表处理
- 字典处理
- 正则处理
- 数据清洗
- 类型转换
- JSON / ORJSON
- 文件数据处理
- HTTP / 数据库数据处理
- 性能优化
- 安全注意事项
- 工具函数推荐结构
如:sum / max / min / zip / enumerate / any / all / sorted
如:tuple 不改、dataclass 使用 frozen=True 防止误改。
- 类型正确
- 格式统一
- 边界条件明确
- 错误可控且可追踪
输入 -> 校验 -> 清洗 -> 转换 -> 输出
name = name.strip()
text = text.encode("utf-8").decode("utf-8")
sql = f"SELECT * FROM users WHERE id = {uid}"
",".join(ids)
clean = re.sub(r"\s+", " ", text)
from decimal import Decimal
price = Decimal("0.1") + Decimal("0.2")
def to_int(x: str | int) -> int | None:
try:
return int(x)
except Exception:
return None
math.isclose(a, b)
from datetime import datetime, timezone
now = datetime.now(timezone.utc)
dt = datetime.strptime("2025-12-04 16:00:00", "%Y-%m-%d %H:%M:%S")
日期一律使用 %Y-%m-%d
datetime.fromtimestamp(ts, tz=timezone.utc)
dt.date() == date.today()
results = [x*x for x in nums if x > 0]
items = map_filter(source, pick)
all_items = [*a, *b]
sorted(users, key=lambda u: u["age"])
uid = data.get("id")
d = d1 | d2
clean = {k: v for k, v in data.items() if v is not None}
new = {new_key: data[old_key]}
utils.deep_get(user, "profile.name")
避免转义地狱:
re.compile(r"\d+")
PATTERN = re.compile(r"foo.*bar")
code = re.search(r"code=(\w+)", url).group(1)
parts = re.split(r"[,; ]+", text)
{x: v for x, v in d.items() if v not in ("", None, [], {})}
clean = {k: v.strip() if isinstance(v, str) else v for k,v in d.items()}
dt.strftime("%Y-%m-%d %H:%M:%S")
使用 list comprehension 对 item 批量处理。
def safe_str(x) -> str:
return x if isinstance(x, str) else str(x)
def auto_type(val):
if val.isdigit():
return int(val)
try:
return float(val)
except:
return val
import orjson
data = orjson.loads(json_bytes)
json_bytes = orjson.dumps(data)
orjson.dumps(data, option=orjson.OPT_SERIALIZE_DATACLASS)
with open("a.txt") as f:
lines = f.readlines()
用 Decimal 解析。
res = requests.get(url, timeout=10)
res.raise_for_status()
data = res.json()
- None 处理
- datetime 转字符串
- Decimal 转字符串
- 去掉非必要字段
yield item
- 禁止 eval(除非严格限制)
- 禁止拼接 SQL(必须使用参数绑定)
- 禁止未知来源的 JSON 字段直接写入数据库
- 禁止未 strip 的字符串写入数据
utils/
__init__.py
string.py # 字符串处理
date.py # 日期时间处理
json.py # orjson 包装
data_clean.py # 数据清洗
data_convert.py # 类型转换
validators.py # 校验器
dict.py # 字典工具
list.py # 列表工具
regex.py # 正则工具
下面是一份 项目级可直接使用的《常用数据处理函数合集》。
所有函数都经过 最佳实践设计、强类型(basedpyright 友好)、兼容 Python 3.12,也符合你当前项目中大量使用的处理逻辑。
你可以直接放入:
utils/data_utils.py
📌 目录
- 字符串处理
- 日期/时间处理
- 数字处理
- 列表处理
- 字典处理
- 正则处理
- JSON 处理(orjson)
- 数据清洗
- 类型转换
- 其他工具
def strip_string(s: str | None) -> str | None:
"""移除前后空白(安全模式)"""
return s.strip() if isinstance(s, str) else s
def ensure_str(value) -> str:
"""强制转换为 str"""
return value if isinstance(value, str) else str(value)
def join_list(items: list[str], sep: str = ",") -> str:
"""安全 join"""
return sep.join(item.strip() for item in items if item)
def substring(s: str, start: int, end: int | None = None) -> str:
return s[start:end]
from datetime import datetime, date, timezone
def to_datetime(s: str) -> datetime | None:
"""字符串转 datetime(自动识别常见格式)"""
patterns = [
"%Y-%m-%d %H:%M:%S",
"%Y-%m-%d",
"%Y/%m/%d %H:%M:%S",
"%Y年%m月%d日 %H:%M:%S",
]
for p in patterns:
try:
return datetime.strptime(s, p).replace(tzinfo=timezone.utc)
except Exception:
pass
return None
def datetime_to_string(dt: datetime, fmt: str = "%Y-%m-%d %H:%M:%S") -> str:
return dt.strftime(fmt)
def timestamp_to_datetime(ts: int | float) -> datetime:
return datetime.fromtimestamp(ts, tz=timezone.utc)
def is_today(dt: datetime) -> bool:
return dt.date() == date.today()
from decimal import Decimal, InvalidOperation
def safe_int(value) -> int | None:
try:
return int(value)
except Exception:
return None
def safe_decimal(value) -> Decimal | None:
try:
return Decimal(str(value))
except InvalidOperation:
return None
from typing import TypeVar, Callable, Iterable
T = TypeVar("T")
R = TypeVar("R")
def map_filter(iterable: Iterable[T], func: Callable[[T], R]) -> list[R]:
"""map + filter None 的组合"""
return [x for x in map(func, iterable) if x is not None]
def flatten(list_of_lists: list[list[T]]) -> list[T]:
"""拍平列表"""
return [item for sub in list_of_lists for item in sub]
def unique(items: list[T]) -> list[T]:
"""保持顺序的去重"""
seen = set()
result = []
for x in items:
if x not in seen:
seen.add(x)
result.append(x)
return result
def dict_pick(d: dict, keys: list[str]) -> dict:
"""提取指定字段"""
return {k: d[k] for k in keys if k in d}
def dict_rename(d: dict, mapping: dict[str, str]) -> dict:
"""批量重命名字段"""
return {mapping.get(k, k): v for k, v in d.items()}
def deep_get(d: dict, path: str, default=None):
"""嵌套字典取值 user.profile.name"""
try:
for key in path.split("."):
d = d[key]
return d
except Exception:
return default
def clean_dict(d: dict) -> dict:
"""移除值为空的项"""
return {k: v for k, v in d.items() if v not in ("", None, [], {})}
import re
def regex_search(pattern: str, text: str) -> str | None:
m = re.search(pattern, text)
return m.group(1) if m else None
def split_by_regex(pattern: str, text: str) -> list[str]:
return re.split(pattern, text)
def extract_after_equal(s: str) -> str | None:
m = re.search(r"=([^&]+)", s)
return m.group(1) if m else None
import orjson
def json_loads(data: str | bytes):
return orjson.loads(data)
def json_dumps(obj) -> str:
return orjson.dumps(obj).decode("utf-8")
def trim_dict_strings(d: dict) -> dict:
"""移除 dict 中所有字符串的前后空白"""
return {k: (v.strip() if isinstance(v, str) else v) for k, v in d.items()}
def normalize_datetime_dict(d: dict) -> dict:
"""dict 中 datetime 转字符串"""
result = {}
for k, v in d.items():
if isinstance(v, datetime):
result[k] = v.strftime("%Y-%m-%d %H:%M:%S")
elif isinstance(v, date):
result[k] = v.strftime("%Y-%m-%d")
else:
result[k] = v
return result
def auto_type(value: str):
"""自动类型识别:int/float/bool"""
value = value.strip()
if value.isdigit():
return int(value)
try:
return float(value)
except Exception:
return value
from pathlib import Path
def get_script_dir() -> Path:
"""获取当前脚本目录"""
return Path(__file__).resolve().parent