如何解析API返回的缺值文本数据并插入Django models
解决方案
核心思路
你当前使用的数据源是固定宽度列格式的结构化文本,所有列的位置是固定的,缺值只会留空不会挤占其他列的位置。因此不需要全局匹配所有数值,只需要先定位每一列的边界,按位置拆分单元格即可彻底解决缺值导致的字段错位问题。
前置准备
你的Django模型所有字段需要先配置null=True和blank=True,用于存储缺失值,示例模型如下:
from django.db import models class UKWeather(models.Model): year = models.IntegerField(null=True, blank=True) jan = models.FloatField(null=True, blank=True) feb = models.FloatField(null=True, blank=True) mar = models.FloatField(null=True, blank=True) apr = models.FloatField(null=True, blank=True) may = models.FloatField(null=True, blank=True) jun = models.FloatField(null=True, blank=True) jul = models.FloatField(null=True, blank=True) aug = models.FloatField(null=True, blank=True) sep = models.FloatField(null=True, blank=True) oct = models.FloatField(null=True, blank=True) nov = models.FloatField(null=True, blank=True) dec = models.FloatField(null=True, blank=True) win = models.FloatField(null=True, blank=True) spr = models.FloatField(null=True, blank=True) sum = models.FloatField(null=True, blank=True) aut = models.FloatField(null=True, blank=True) ann = models.FloatField(null=True, blank=True)
完整解析代码
import requests import re r = requests.get('https://www.metoffice.gov.uk/pub/data/weather/uk/climate/datasets/Tmax/date/UK.txt') # 过滤空行 lines = [line.rstrip('\n') for line in r.text.splitlines() if line.strip()] # 提取表头行,获取每一列的起始位置 header_line = lines[5] header_pattern = re.compile(r'\S+') col_starts = [match.start() for match in header_pattern.finditer(header_line)] # 补充行尾边界,用于截取最后一列 col_starts.append(None) # 列名顺序和你模型的18个字段完全对应 col_names = header_pattern.findall(header_line) # 遍历所有数据行 for line in lines[6:]: row_data = [] # 按列位置拆分单元格 for idx in range(len(col_starts)-1): start = col_starts[idx] end = col_starts[idx+1] cell_val = line[start:end].strip() # 空值处理为None if not cell_val: row_data.append(None) else: # 第一列为年份转整数,其余字段转浮点数 row_data.append(int(cell_val) if idx == 0 else float(cell_val)) # 转换为字段字典直接存入模型 data_dict = dict(zip(col_names, row_data)) UKWeather.objects.create(**data_dict)
逻辑说明
- 基于表头列位置拆分单元格,完全不受缺值影响,不会出现字段错位
- 空单元格自动识别为
None,兼容模型的空值配置 - 不需要全局匹配数值,避免无效匹配导致的顺序混乱
内容的提问来源于stack exchange,提问作者Aashay Amballi
相关产品推荐
相关产品推荐

