You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:06:03