作为一个学完Python基础知识的测试,终于可以像RD们自己写脚本处理任何场景吧,如何优雅地写出来代码,接下来开启进阶版的Python。

俗话说“量变引起质变“,一旦数据量过大时,我们一般会通过Excel表来存储。原因在于Excel表具有数据库筛选查询的功能。

本期,使用Python 第三方库openpyxl 来对Excel原始数据进行处理,一起来涨知识吧~

1. 问题背景

继上一篇Python对多媒体文件解析后,内容可以输出指定的文件中,文件形式可以是Text或者Excel方式。比如我们将某一目录下的多媒体文件,解析后输入Excel文件中,形式如下:

怎样把series转置 如何转置excel_怎样把series转置

通过Excel表数据内容展示,虽然可以一眼看到多媒体文件详细信息,但是数据直接都是零散的,对应数据筛选非常不利…所以要继续对得到的解析内容进行处理:

  • 将多媒体各个字段名称作为ceil_name
  • 多媒体文件数据转换成行存储

整理后形式大致如下:

怎样把series转置 如何转置excel_Python_02

2. 原始数据分析

2.1 文件准备

  • 1、原始数据
  • 我们通过pymediainfo库对多媒体文件进行解析,解析的信息输入到Excel表
  • 对Movie、Music和Picture三种形式多媒体文件分别在三张sheet表存储
  • 将得到Excel表数据作为我们的origin_workbook
  • 2、安装openpyxl库
  • openpyxl是第三方库,在使用前需要使用pip安装
pip install openpyxl
  • 3、脚本导入形式
  • 创建目标Excel文件:需要导入openpyxl库中Workbook
from openpyxl import Workbook
  • 加载原始Excel文件:需要导入openpyxl库中load_workbook
from openpyxl import load_workbook

2.2 track_type 类型

  • 一般多媒体文件总会存在 2~7个 track_type 值,video/music/picture输出大致一样:
  • 常见通常为General,Video,Audio,特殊的Track_type还包含Other、Text、Menu和Image
  • 每一个track_type都有其多个key属性
  • 因此,根据 track_type + :: + key(track_type二级属性) 来命名每一列的title,可以直观体现出什么属性类型的属性的值,举个 栗子
  • General属性下Complete name:那么title名就为General::Complete name
def getTitle(key_type, key):
    return key_type + '::' + key
  • 代码中从原始Excel表中获取track_type及key可以使用json嵌套list来存储
DATA_KEYS = {
        'General' : [],
        'Text' : [],
        'Video' : [],
        'Audio' : [],
        'Menu' : [],
        'Image' : [],
        'Other' : [],
}

2.3 key值获取方法

  • 我们观察到每个key属性value值都在":"后面
Overall bit rate mode                    : Constant
  • 可以通过字符串str.find(“:”)方法,获取到":"位置,通过分片来确认key和value值
split_index = value.find(":")
key,value = (i.strip() for i in [value[:split_index], value[split_index+len(DATA_SPLIT):]])
  • 也可以通过str.split(“:”)得到[key,value]
split_list = value.split(":")
key,value = (i.strip() for i in split_list)
  • 特殊media会出现同一个track_type,会有多种子情况sub_key_type。如Other类型有#1和#2两种情况

怎样把series转置 如何转置excel_Python_03

  • 可以通过记录同一个多媒体文件Genreal来当唯一ID,调用merge_cells()方法进行合并
target_sheet.merge_cells(start_row=row_index, start_column=1, end_row=end_row, end_column=1)

3. Excel表解析

  • 在origin_sheet中逐行解析,获取datakeysMap

怎样把series转置 如何转置excel_python_04

  • 根据data_keys,在target_sheet中(1,i)每列写入title名字
  • 在写入每一个track_type::key所在的列数index,存储在map-result中
  • 在进行每行数据填写时,可以更加key值所在列数进行填充对应的value值
  • 通过origin_sheet中数据,将所对应的值一一对应填写到target_sheet中
  • 通过嵌套的json特点,将每一个type_datas中key进行查询,写入到target_sheet

4. 实现效果

怎样把series转置 如何转置excel_excel_05

5. 总结

本期使用openpyxl库和哈希表来处理Excel表中数据进行转置操作,前提先通过哈希表data_keys在原始表中收集key和value,然后target_sheet根据data_keys()写入到第一行N列作为表头。

前期工作作为后,开始对原始数据在target_sheet每一行进行填写相关值即可。在添加过程中需要记录同一个ID的start_row和max_row,用于合并同General的行。

以上是本期内容,欢迎大佬们点赞评论,下期见~~~

---------------------------END---------------------------