Python脚本如何补全新增字段默认数据

wen python案例 37

本文目录导读:

Python脚本如何补全新增字段默认数据

  1. 使用字典的 get() 方法
  2. 使用 setdefault() 方法
  3. 批量处理字典列表
  4. 使用 defaultdict 处理复杂场景
  5. 面向对象方式(推荐用于复杂项目)
  6. 处理CSV/JSON文件场景
  7. 带类型检查和转换的补全
  8. 选择建议

我来介绍几种在Python脚本中补全新增字段默认数据的方法:

使用字典的 get() 方法

# 原始数据
data = {'name': '张三', 'age': 25}
# 补全新增字段
new_fields = ['email', 'phone', 'address']
default_values = {
    'email': '',
    'phone': '',
    'address': '未填写'
}
# 使用get()方法补全
for field in new_fields:
    data[field] = data.get(field, default_values[field])
print(data)
# 输出: {'name': '张三', 'age': 25, 'email': '', 'phone': '', 'address': '未填写'}

使用 setdefault() 方法

# 原始数据
data = {'name': '李四', 'age': 30}
# 使用setdefault()补全缺失字段
data.setdefault('email', '')
data.setdefault('phone', '')
data.setdefault('address', '未填写')
print(data)
# 输出: {'name': '李四', 'age': 30, 'email': '', 'phone': '', 'address': '未填写'}

批量处理字典列表

def fill_missing_fields(data_list, field_defaults):
    """
    批量补全字典列表中的缺失字段
    :param data_list: 字典列表
    :param field_defaults: 字段默认值字典
    :return: 补全后的字典列表
    """
    return [{**field_defaults, **item} for item in data_list]
# 示例数据
records = [
    {'name': '王五', 'age': 28},
    {'name': '赵六', 'age': 35, 'email': 'zhao@example.com'},
    {'name': '孙七', 'age': 22, 'address': '北京'}
]
# 定义默认值
defaults = {
    'email': '',
    'phone': '',
    'address': '未填写',
    'status': 'active'
}
# 补全数据
filled_records = fill_missing_fields(records, defaults)
for record in filled_records:
    print(record)

使用 defaultdict 处理复杂场景

from collections import defaultdict
def process_with_defaults(data, defaults):
    """使用defaultdict处理数据"""
    result = defaultdict(lambda: '')
    # 更新默认值
    result.update(defaults)
    # 更新实际数据
    result.update(data)
    return dict(result)
# 测试
data = {'name': '周八', 'age': 29}
defaults = {
    'email': '',
    'phone': '000-0000-0000',
    'address': '未填写',
    'created_at': '2024-01-01'
}
result = process_with_defaults(data, defaults)
print(result)

面向对象方式(推荐用于复杂项目)

class DataFiller:
    """数据补全类"""
    def __init__(self, default_values=None):
        """初始化默认值"""
        self.defaults = default_values or {}
    def fill(self, data):
        """补全单个数据"""
        return {**self.defaults, **data}
    def fill_batch(self, data_list):
        """批量补全数据"""
        return [self.fill(item) for item in data_list]
    def fill_with_validation(self, data, required_fields=None):
        """补全并验证数据"""
        filled = self.fill(data)
        if required_fields:
            missing = [f for f in required_fields if f not in data]
            if missing:
                print(f"警告:缺少必要字段 {missing}")
        return filled
# 使用示例
filler = DataFiller({
    'email': '',
    'phone': '',
    'address': '未填写',
    'status': 'active',
    'created_at': '2024-01-01'
})
# 单个数据补全
user_data = {'name': '张三', 'age': 25}
filled_data = filler.fill(user_data)
print(filled_data)
# 批量数据补全
users = [
    {'name': '李四', 'age': 30},
    {'name': '王五', 'age': 28, 'email': 'wang@example.com'}
]
filled_users = filler.fill_batch(users)
print(filled_users)

处理CSV/JSON文件场景

import json
import csv
def fill_csv_data(input_file, output_file, defaults):
    """补全CSV文件数据"""
    with open(input_file, 'r', encoding='utf-8') as infile, \
         open(output_file, 'w', encoding='utf-8', newline='') as outfile:
        reader = csv.DictReader(infile)
        fieldnames = list(defaults.keys())
        writer = csv.DictWriter(outfile, fieldnames=fieldnames)
        writer.writeheader()
        for row in reader:
            # 补全缺失字段
            filled_row = {**defaults, **row}
            writer.writerow(filled_row)
def fill_json_data(data, defaults):
    """补全JSON数据"""
    if isinstance(data, list):
        return [{**defaults, **item} for item in data]
    elif isinstance(data, dict):
        return {**defaults, **data}
    return data
# 使用示例
defaults = {
    'email': '',
    'phone': '',
    'address': '未填写'
}
# JSON数据处理
json_data = [{'name': '张三'}, {'name': '李四', 'email': 'li@example.com'}]
filled_json = fill_json_data(json_data, defaults)
print(json.dumps(filled_json, ensure_ascii=False, indent=2))

带类型检查和转换的补全

from typing import Any, Dict, List
class SmartDataFiller:
    """智能数据补全器"""
    def __init__(self, schema: Dict[str, Dict[str, Any]]):
        """
        初始化字段模式
        schema格式: {'field_name': {'default': value, 'type': type, 'required': bool}}
        """
        self.schema = schema
    def fill(self, data: Dict[str, Any]) -> Dict[str, Any]:
        """补全数据并确保类型正确"""
        result = {}
        for field, field_config in self.schema.items():
            value = data.get(field, field_config.get('default'))
            # 类型转换
            expected_type = field_config.get('type')
            if expected_type and value is not None:
                try:
                    value = expected_type(value)
                except (ValueError, TypeError):
                    value = field_config.get('default')
            result[field] = value
        return result
# 使用示例
schema = {
    'name': {'default': '', 'type': str, 'required': True},
    'age': {'default': 0, 'type': int, 'required': False},
    'email': {'default': '', 'type': str, 'required': False},
    'phone': {'default': '', 'type': str, 'required': False},
    'is_active': {'default': True, 'type': bool, 'required': False}
}
filler = SmartDataFiller(schema)
# 测试数据
test_data = {'name': '张三', 'age': '25', 'email': 'zhang@example.com'}
filled_data = filler.fill(test_data)
print(filled_data)
# 输出: {'name': '张三', 'age': 25, 'email': 'zhang@example.com', 'phone': '', 'is_active': True}

选择建议

  1. 简单场景:使用字典的 get()setdefault() 方法
  2. 批量处理:使用列表推导式或 fill_missing_fields() 函数
  3. 复杂项目:使用面向对象方式,创建 DataFiller
  4. 数据迁移:使用专门的迁移脚本,结合数据库操作
  5. 高性能需求:使用 defaultdictcollections.ChainMap

选择哪种方法取决于你的具体需求和数据量大小。

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