当前位置:首页>Excel>Python 玩转 Excel 案例【第 27 期】:多层表头扁平化处理

Python 玩转 Excel 案例【第 27 期】:多层表头扁平化处理

  • 2026-05-08 13:32:42
Python 玩转 Excel 案例【第 27 期】:多层表头扁平化处理

Python 玩转 Excel 案例【第 27 期】:多层表头扁平化处理

📌 案例说明

原始数据表(测试数据.xlsx):

        A           B          C          D          E    ┌─────────────────────────────────────────────────────┐  1 │           公司财务报表                              │    ├─────────────────────────────────────────────────────┤  2 │               2024年度                              │    ├─────────────────────────────────────────────────────┤  3 │                                                     │    ├──────────┬──────────┬──────────┬──────────┬────────┤  4 │   产品   │ 手机业务 │ 手机业务 │ 电脑业务 │ 电脑业务│    ├──────────┼──────────┼──────────┼──────────┼────────┤  5 │   型号   │   Q1     │   Q2     │   Q1     │   Q2    │    ├──────────┼──────────┼──────────┼──────────┼────────┤  6 │   名称   │   销量   │   销量   │   销量   │   销量  │    ├──────────┼──────────┼──────────┼──────────┼────────┤  7 │ iPhone15 │   100    │   120    │    80    │    90   │    ├──────────┼──────────┼──────────┼──────────┼────────┤  8 │ iPhone14 │    80    │    90    │    60    │    70   │    ├──────────┼──────────┼──────────┼──────────┼────────┤  9 │ MacBook  │    50    │    60    │    40    │    50   │    └──────────┴──────────┴──────────┴──────────┴────────┘

这是 Excel 数据处理中非常经典的场景:表格存在多层表头

原始数据中:

  • • 前3行是报表标题和空行(行1-3)
  • • 第4-6行是三层表头(业务类型 → 季度 → 指标名称)
  • • 第7行开始是具体数据

这种结构便于人工阅读,但对数据分析来说是“障碍”——pandas 默认读取会丢失层级关系,无法准确识别每一列的业务含义。

本期案例跟大家一起学习用 Python 自动处理多层表头,将三层表头扁平化为有意义的单层列名,为后续分析扫清障碍。

核心操作:提取多层表头 + 组合扁平化列名 + 数据区域对齐

  • • 关键库pandas
  • • 核心逻辑:跳过无关行,提取三层表头区域,按列组合成扁平列名,再与数据区域拼接

📜 完整代码

"""多层表头扁平化处理 - 自动将三层表头组合成有意义的单层列名使用 pandas 实现“表头提取 + 列名组合 + 数据对齐”的自动化处理"""import pandas as pddef flatten_multiheader_excel(file_path, header_start_row=3, header_depth=3):    """    通用多层表头扁平化处理    参数:        file_path: Excel文件路径        header_start_row: 表头起始行(0-indexed)        header_depth: 表头层数    """    # 1. 读取原始数据(不设表头)    df_raw = pd.read_excel(file_path, header=None)    # 2. 提取表头区域    header_rows = df_raw.iloc[header_start_row:header_start_row + header_depth].values    # 3. 生成扁平化列名    columns = []    for col_idx in range(len(header_rows[0])):        if col_idx == 0:  # 第一列是产品名称列            columns.append('产品')        else:            # 组合多层表头            levels = [str(header_rows[r][col_idx]).strip() if pd.notna(header_rows[r][col_idx]) else ''                      for r in range(header_depth)]            col_name = '_'.join(filter(None, levels))            columns.append(col_name if col_name else f'col{col_idx}')    # 4. 提取数据区域    data = df_raw.iloc[header_start_row + header_depth:].values    df = pd.DataFrame(data, columns=columns)    # 5. 清理产品列(处理空值)    df['产品'] = df['产品'].fillna('').astype(str)    df = df[df['产品'].ne('')]  # 过滤掉空产品名的行    # 6. 设置产品为索引    df.set_index('产品', inplace=True)    # 7. 转换数值列    for col in df.columns:        df[col] = pd.to_numeric(df[col], errors='coerce')    return df# 使用if __name__ == "__main__":    df = flatten_multiheader_excel('测试数据.xlsx', header_start_row=3, header_depth=3)    print(df)    df.to_excel('测试数据_更健壮.xlsx')

运行结果(测试数据_更健壮.xlsx):

产品
手机业务_Q1_销量
手机业务_Q2_销量
电脑业务_Q1_销量
电脑业务_Q2_销量
iPhone15
100
120
80
90
iPhone14
80
90
60
70
MacBook
50
60
40
50

💡 结果分析:三层杂乱的表头被组合成了清晰的单层列名。产品列变成了行索引,每一列的名称都清晰地表达了“业务_季度_指标”的含义,数据可以直接用于分组统计、透视分析等操作。


第一步:导入所需库

import pandas as pd

代码解释:

  • • import pandas as pd导入 pandas 库并简写为 pd。pandas 是 Python 数据分析的核心库,提供了强大的数据读取、处理和转换功能。

第二步:读取原始数据

df_raw = pd.read_excel(file_path, header=None)

代码解释:

  • • pd.read_excel(file_path)读取指定路径的 Excel 文件,返回 DataFrame 对象。
  • • header=None这个参数非常关键!pandas 默认会将第一行作为列名。但我们这个 Excel 的前3行是标题和空行,第4行才开始是真正的表头。所以需要设置 header=None,让 pandas 将所有行都当作数据读取(包括表头行),行号会自动从0开始编号。

对比示例:

# 默认读取(header=0)df_default = pd.read_excel('测试数据.xlsx')print(df_default.columns)# 输出:Index(['公司财务报表', 'Unnamed: 1', 'Unnamed: 2', ...], dtype='object')# 第一行变成了列名,完全乱了!# 不设表头(header=None)df_raw = pd.read_excel('测试数据.xlsx', header=None)print(df_raw.iloc[0])  # 第1行# 输出:# 0    公司财务报表# 1      NaN# 2      NaN# ...# 所有行都被当作数据保留,原始结构完整

💡 小贴士header=None 后,pandas 会自动给列编号为 0, 1, 2, 3... 方便我们按位置操作。


第三步:提取表头区域

header_rows = df_raw.iloc[header_start_row:header_start_row + header_depth].values

代码解释:

  • • df_raw.iloc[行起点:行终点]用 iloc 按位置切片。pandas 的行索引从 0 开始计数。
  • • header_start_row=3表示表头从 Excel 的第4行开始(因为 0→第1行,1→第2行,2→第3行,3→第4行)。
  • • header_depth=3表示表头共有3行。
  • • .values将切片结果从 DataFrame 转换为 NumPy 二维数组,去掉行列索引,方便后续按列操作。

执行过程可视化:

# header_start_row=3, header_depth=3# 切片范围:行3 到 行6(不包含行6)header_rows = df_raw.iloc[3:6].values# 得到的结果:# [#     ['产品', '手机业务', '手机业务', '电脑业务', '电脑业务'],  # 行3(原Excel第4行)#     ['型号', 'Q1', 'Q2', 'Q1', 'Q2'],                       # 行4(原Excel第5行)#     ['名称', '销量', '销量', '销量', '销量']                 # 行5(原Excel第6行)# ]

为什么用 .values

操作
df_raw.iloc[3:6]df_raw.iloc[3:6].values
返回类型
DataFrame
NumPy 数组
是否有索引
有(行号、列号)
无(纯数据)
访问元素
df.iloc[0,0]arr[0][0]
适用场景
需要 pandas 功能
纯粹遍历修改

在本例中,我们只需要遍历和修改表头数据,用数组更简洁。


第四步:生成扁平化列名

columns = []for col_idx in range(len(header_rows[0])):    if col_idx == 0:  # 第一列是产品名称列,保留原名称        columns.append('产品')    else:        # 组合多层表头        levels = [str(header_rows[r][col_idx]).strip() if pd.notna(header_rows[r][col_idx]) else '' for r in range(header_depth)]        col_name = '_'.join(filter(None, levels))        columns.append(col_name if col_name else f'col{col_idx}')

代码解释:

这是整个案例的核心——将纵向的三层表头按列组合成横向的单层列名。

步骤拆解:

① 确定总列数

len(header_rows[0])  # 表头第一行的长度 = 5列

② 遍历每一列

for col_idx in range(len(header_rows[0])):  # col_idx = 0,1,2,3,4

③ 第0列特殊处理(产品列)

if col_idx == 0:    columns.append('产品')  # 第一列保留为'产品'

④ 其他列:组合三层表头

# 以 col_idx=1 为例(第2列)levels = [    str(header_rows[0][1]),  # '手机业务'    str(header_rows[1][1]),  # 'Q1'    str(header_rows[2][1])   # '销量']# levels = ['手机业务', 'Q1', '销量']col_name = '_'.join(filter(None, levels))# filter(None, levels) 过滤掉空字符串# '_'.join(['手机业务', 'Q1', '销量']) → '手机业务_Q1_销量'

④-1 核心代码逐行拆解

levels = [str(header_rows[r][col_idx]).strip() if pd.notna(header_rows[r][col_idx]) else ''          for r in range(header_depth)]

这行代码是一个列表推导式,它的作用是将某一列的三层表头值提取出来,存入列表 levels

拆解分析:

组成部分
含义
示例值(col_idx=1
for r in range(header_depth)
遍历0、1、2(三层)
r=0,1,2
header_rows[r][col_idx]
获取第r层、第col_idx列的值
'手机业务'
'Q1''销量'
pd.notna(...)
判断是否为NaN(空值)
True
 / False
str(...).strip()
转字符串并去除首尾空格
'手机业务'
... if ... else ''
有值则保留,无值则用空字符串
'手机业务'

等价于传统循环写法:

levels = []for r in range(header_depth):    val = header_rows[r][col_idx]    if pd.notna(val):           # 如果不是空值        levels.append(str(val).strip())    else:                       # 如果是空值        levels.append('')

执行示例(col_idx=1):

# r=0: val='手机业务' → 有值 → levels.append('手机业务')# r=1: val='Q1'       → 有值 → levels.append('Q1')# r=2: val='销量'     → 有值 → levels.append('销量')# 结果:levels = ['手机业务', 'Q1', '销量']
col_name = '_'.join(filter(None, levels))

这行代码将 levels 列表中的非空值用下划线 _ 连接成一个字符串。

filter(None, levels) 的作用:

过滤掉 levels 中的假值(空字符串 ''NoneFalse 等)。

# 示例:假设某一列有合并单元格导致第二层为空levels = ['手机业务', '', '销量']filter(None, levels)  # 过滤后 → ['手机业务', '销量']

'_'.join(...) 的作用:

将列表中的字符串用 _ 连接。

# 正常情况'_'.join(['手机业务', 'Q1', '销量'])  # → '手机业务_Q1_销量'# 有缺失值的情况(自动跳过空值)'_'.join(filter(None, ['手机业务', '', '销量']))  # → '手机业务_销量'

⑤ 防止空列名

columns.append(col_name if col_name else f'col{col_idx}')# 如果 col_name 是空字符串,用默认名称 'col2'、'col3' 等代替

完整执行过程表格:

列号
第1层
第2层
第3层
组合结果
0
产品
型号
名称
产品
(特殊处理)
1
手机业务
Q1
销量
手机业务_Q1_销量
2
手机业务
Q2
销量
手机业务_Q2_销量
3
电脑业务
Q1
销量
电脑业务_Q1_销量
4
电脑业务
Q2
销量
电脑业务_Q2_销量

最终生成的 columns 列表:

['产品', '手机业务_Q1_销量', '手机业务_Q2_销量', '电脑业务_Q1_销量', '电脑业务_Q2_销量']

💡 小贴士:如果你的表头层级不同(如2层或4层),只需修改 header_depth 参数即可,代码自动适配。


第五步:提取数据区域

data = df_raw.iloc[header_start_row + header_depth:].valuesdf = pd.DataFrame(data, columns=columns)

代码解释:

  • • header_start_row + header_depth计算数据区域的起始行。表头占用了3行,数据从下一行开始。
    • • 示例:3 + 3 = 6 → 从第7行开始(0-indexed,即原Excel的第7行)
  • • df_raw.iloc[6:].values从第7行开始取到最后一行,转换为数组。
  • • pd.DataFrame(data, columns=columns)用数据数组 + 刚生成的列名,创建新的 DataFrame。

执行过程:

# 原始数据区域(从行6开始)data = [    ['iPhone15', 100, 120, 80, 90],    ['iPhone14', 80, 90, 60, 70],    ['MacBook', 50, 60, 40, 50]]# 创建DataFramedf = pd.DataFrame(data, columns=['产品', '手机业务_Q1_销量', ...])

结果:

产品
手机业务_Q1_销量
手机业务_Q2_销量
电脑业务_Q1_销量
电脑业务_Q2_销量
iPhone15
100
120
80
90
iPhone14
80
90
60
70
MacBook
50
60
40
50

第六步:清理产品列

df['产品'] = df['产品'].fillna('').astype(str)df = df[df['产品'].ne('')]

代码解释:

  • • .fillna('')将空值(NaN)替换为空字符串 ''。因为后续需要过滤空行。
  • • .astype(str)将所有值转换为字符串类型,确保比较操作不出错。
  • • df['产品'].ne('')ne 是 not equal 的缩写,筛选出产品列不等于空字符串的行。

为什么要清理?

原始数据中,产品列可能存在:

  • • 空行(Excel中多余的空白行)
  • • 合并单元格导致的部分空值

这些无效行需要被过滤掉,否则会影响后续分析。

过滤前后对比:

场景
过滤前
过滤后
有产品名
✅ 保留
✅ 保留
空字符串 ''
❌ 删除
❌ 删除
NaN 空值
❌ 删除
❌ 删除

💡 小贴士:如果原始数据中产品列绝对没有空值,这一步可以省略。但保留它是个好习惯——防御性编程。


第七步:设置产品为索引

df.set_index('产品', inplace=True)

代码解释:

  • • set_index('产品')将 产品 列设置为 DataFrame 的行索引(不再是普通列)。
  • • inplace=True原地修改,不返回新对象。

为什么要设置索引?

操作
设置索引前
设置索引后
查询数据
df[df['产品']=='iPhone15']df.loc['iPhone15']
代码可读性
较繁琐
✅ 简洁直观
转置操作
产品列会变成行
✅ 产品名变成列名(更清晰)

效果对比:

# 设置索引前print(df)#      产品  手机业务_Q1_销量  ...# 0  iPhone15        100    ...# 1  iPhone14         80    ...# 设置索引后print(df)#          手机业务_Q1_销量  ...# 产品                      # iPhone15        100    ...# iPhone14         80    ...

第八步:转换数值列

for col in df.columns:    df[col] = pd.to_numeric(df[col], errors='coerce')

代码解释:

  • • pd.to_numeric(df[col], errors='coerce')将列中的值转换为数字类型。无法转换的(如空字符串、文本)变成 NaN
  • • errors='coerce'遇错不报错,转为 NaN

为什么要转换?

pandas 读取 Excel 时,所有数据默认都是 object 类型(相当于字符串)。如果不转换,无法进行数学运算:

# 转换前df['手机业务_Q1_销量'].sum()# 输出:'1008012050'  ← 字符串拼接,不是求和!# 转换后df['手机业务_Q1_销量'].sum()# 输出:230  ← 正确的求和结果

数据类型变化:

原始值
转换前类型
转换后类型
转换后值
100strint64100
abcstrfloat64NaN
''
(空)
strfloat64NaN

💡 小贴士:如果所有列都是数值,也可以用 df = df.apply(pd.to_numeric, errors='coerce') 一行搞定。


第九步:保存结果

df.to_excel('测试数据_更健壮.xlsx')

代码解释:

  • • df.to_excel('文件名.xlsx')将 DataFrame 保存为 Excel 文件。
  • • 默认行为:只保存数据,不保留原 Excel 格式(颜色、字体等)。

💡 小贴士:如果需要控制 Sheet 名称:df.to_excel('文件名.xlsx', sheet_name='Sheet1')。如果文件已存在,会被覆盖。


完整流程可视化

处理前(原始数据):

A
B
C
D
E
0
公司财务报表
1
2024年度
2
3
产品
手机业务
手机业务
电脑业务
电脑业务
4
型号
Q1
Q2
Q1
Q2
5
名称
销量
销量
销量
销量
6
iPhone15
100
120
80
90
7
iPhone14
80
90
60
70
8
MacBook
50
60
40
50

处理过程:

步骤1: 读取(header=None)→ 保留所有行步骤2: 提取表头区域 → 行3-5,按列组合步骤3: 生成列名 → ['产品', '手机业务_Q1_销量', ...]步骤4: 提取数据区域 → 行6-8步骤5: 创建新DataFrame → 数据 + 新列名步骤6: 清理产品列 → 过滤空行步骤7: 设置产品为索引步骤8: 转换数值类型

处理后:

产品
手机业务_Q1_销量
手机业务_Q2_销量
电脑业务_Q1_销量
电脑业务_Q2_销量
iPhone15
100
120
80
90
iPhone14
80
90
60
70
MacBook
50
60
40
50

📚 本期核心知识点

📍 知识点 1:header=None 不设表头读取

df = pd.read_excel('文件.xlsx', header=None)
参数
行为
适用场景
header=0
(默认)
第一行作为列名
标准表格
header=None
所有行作为数据(列名为0,1,2...)
存在标题行、多层表头
header=[0,1,2]
多行作为多层列名
pandas MultiIndex 方案

📍 知识点 2:iloc 按位置切片

df.iloc[行起点:行终点, 列起点:列终点]
  • • 行号和列号都从 0 开始
  • • 遵循 左闭右开 原则:包含起点,不包含终点

示例:

df.iloc[3:6]     # 取行3、行4、行5(不包含行6)df.iloc[3:6, 1]  # 取行3-5的第2列

📍 知识点 3:.values 转换为 NumPy 数组

header_rows = df_raw.iloc[3:6].values
返回类型
优点
缺点
DataFrame
功能丰富
访问慢,df.iloc[r,c]
NumPy 数组
访问快,arr[r][c]
功能少

📍 知识点 4:多层表头组合技巧

levels = [str(header_rows[r][col_idx]).strip() if pd.notna(header_rows[r][col_idx]) else ''          for r in range(header_depth)]col_name = '_'.join(filter(None, levels))
  • • 列表推导式:一行代码提取多层表头
  • • filter(None, levels):过滤空字符串
  • • '_'.join(...):用下划线连接

📍 知识点 5:fillna() 和 astype() 处理空值

df['列名'] = df['列名'].fillna('').astype(str)
  • • fillna(''):NaN → 空字符串
  • • astype(str):确保所有值都是字符串类型

📍 知识点 6:ne() 不等于筛选

df = df[df['产品'].ne('')]  # 相当于 df['产品'] != ''

ne = not equal,是 pandas 的比较方法。

📍 知识点 7:set_index() 设置行索引

df.set_index('产品', inplace=True)  # 原地修改df = df.set_index('产品')           # 返回新对象

📍 知识点 8:pd.to_numeric() 类型转换

df[col] = pd.to_numeric(df[col], errors='coerce')
errors
 参数
行为
'raise'
(默认)
遇到无法转换的值就报错
'ignore'
保持原样,不转换
'coerce'
无法转换的变为 NaN

🔄 本案例核心流程

① 读取(header=None) → ② 提取表头区域 → ③ 按列组合成扁平列名 → ④ 提取数据区域 → ⑤ 创建新DataFrame → ⑥ 清理产品列 → ⑦ 设置产品为索引 → ⑧ 转换数值类型 → ⑨ 保存文件

读取 Excel (header=None)        ↓提取表头区域 (iloc[3:6].values)        ↓遍历每一列,组合表头        ↓┌─────────────────────────────────────────────┐│ 对于第1列:columns.append('产品')            ││ 对于其他列:                                 ││   1. 提取三层值 → [手机业务, Q1, 销量]       ││   2. 连接成 '手机业务_Q1_销量'               ││   3. 添加到 columns 列表                     │└─────────────────────────────────────────────┘        ↓提取数据区域 (iloc[6:].values)        ↓创建新DataFrame (data, columns=columns)        ↓清理产品列 (fillna + astype + 过滤)        ↓设置产品为索引 (set_index)        ↓转换数值列 (to_numeric)        ↓保存到新文件 (to_excel)

🗳️ 点单时间到! 🗳️

下期写什么?你来定,我来写。

评论区见!👇


📦 资源获取提示

关注「码农自习室」,后台回复关键词 PythonExcel案例,即可获取本文完整代码及配套练习数据集,一起动手掌握高效数据操作的核心技巧!


❤️ 支持我们

如果本文对你有帮助,欢迎点赞 + 关注 + 点亮小红心,你的支持就是我们持续创作的最大动力~

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-09 06:49:35 HTTP/2.0 GET : https://h.sjds.net/a/513351.html
  2. 运行时间 : 0.109371s [ 吞吐率:9.14req/s ] 内存消耗:4,382.69kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=7093ec8a6bc315c0537e6dd37d918d39
  1. /yingpanguazai/ssd/ssd1/www/h.sjds.net/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/h.sjds.net/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/h.sjds.net/runtime/temp/ad153693ed39fba6d1bda2fe72512cde.php ( 12.06 KB )
  140. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001119s ] mysql:host=127.0.0.1;port=3306;dbname=h_sjds;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001083s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000291s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000274s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000662s ]
  6. SELECT * FROM `set` [ RunTime:0.000256s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000583s ]
  8. SELECT * FROM `article` WHERE `id` = 513351 LIMIT 1 [ RunTime:0.000521s ]
  9. UPDATE `article` SET `lasttime` = 1778280575 WHERE `id` = 513351 [ RunTime:0.003841s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.000234s ]
  11. SELECT * FROM `article` WHERE `id` < 513351 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000427s ]
  12. SELECT * FROM `article` WHERE `id` > 513351 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000332s ]
  13. SELECT * FROM `article` WHERE `id` < 513351 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000612s ]
  14. SELECT * FROM `article` WHERE `id` < 513351 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000780s ]
  15. SELECT * FROM `article` WHERE `id` < 513351 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002146s ]
0.110956s