本文目录导读:

- 使用字典的
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
选择哪种方法取决于你的具体需求和数据量大小。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播