本文目录导读:

- 使用字典的
get()方法 - 使用
setdefault()方法 - 批量处理字典列表
- 使用
defaultdict处理复杂场景 - 面向对象方式(推荐用于复杂项目)
- 处理CSV/JSON文件场景
- 带类型检查和转换的补全
- 选择建议
我来介绍几种在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}
选择建议
- 简单场景:使用字典的
get()或setdefault()方法 - 批量处理:使用列表推导式或
fill_missing_fields()函数 - 复杂项目:使用面向对象方式,创建
DataFiller类 - 数据迁移:使用专门的迁移脚本,结合数据库操作
- 高性能需求:使用
defaultdict或collections.ChainMap
选择哪种方法取决于你的具体需求和数据量大小。