通过mutagen 把metadata转成python pandas 数据框

介绍

序:

大家好,在 reaper 中使用媒体浏览器的时候可以给媒体文件添加 id3 或者自定义的)标签。 我尝试了用 python 的 scipy 模组提取标签,感觉有点费劲,于是我就上网找,看到一个叫做 mutagen 的。 试了一下觉得挺方便的,于是和大家分享。

你会得到什么:

一个基础的脚本。 加以简单的魔改便可以植入你的工作流。

你需要的编程水平:

为什么:

植入在wav文件内部的标签好处就在于在预览时就可以进行方便的编辑,然后直接提交给其他软件使用例如音频中间件adx, Elias,Fmod, Wwise等。

用什么管理:

python和pandas。两者都是比较适合非程序员的。安装python后安装python包pandas,你可以在很短时间编写出一些基础功能。

步骤

第一步:

把该安装的包安装并加载进来

import sys
import mutagen as mtg
import os
import pandas as pd
import numpy as np

第二步:

在一个单独的wav文件上实验并做基础的数据清洗

输入媒体路径

just_one_wav_item='/Users/jiaweilu/Desktop/metadata_test/reaper_freeze_some_arbitary_name-01 render 001.wav'
one_item_unproccessed=mtg.File(just_one_wav_item)

通过pprint 来得到一个方便parse的字符串

formatted_one_wav_item=one_item_unproccessed.pprint()

使用split 切割功能来得到一个包含所有字符的list

everything_listed=formatted_one_wav_item.split()

把不要的干掉,1到11是描述波形文件的信息。当然如果你想留着也可以,需要打印出 formatted_one_wav_item 来单独看那些需要那些干掉

del everything_listed[:11]

用split把等号干掉并把 index 和 value 分出来,=就是 seperator

new_list=[]
for i in everything_listed:
    j=i.split('=')
    for k in j:
        new_list.append(k)

由于comment中有俩= 需要特殊处理

del new_list[1:3]

自定义reaper的tag里也有俩=,特殊处理

del new_list[-3]

拆分成index和key两个列表,并重新打包(需要同时使用zip和set).这里需要注意的是,如果zip 再set的文件不同时,输出的列表的顺序是混乱的.需要重新sort

index_list=(new_list[::2])
key_list=(new_list[1::2])
final_list=zip(index_list,key_list)
final_list=sorted(set(final_list))
打印出来瞅瞅
print(final_list)

第三步:

把上述步骤做成一个函数
在上一步中,我们使用了很多python不同模组的函数。现在,我们要把这些函数都打包成一个函数。
这样输入(reaper里标签好的音频文件)进来,输出(一个方便被转化成‘熊猫数据框’的字典)出去。
python中简单的格式如下:

def 函数的名字(函数需要的变量,也就是输入):
    对变量的操作
    对变量的操作
    对变量的操作
    return (输出)  
def proccess_single_wav(wav):
    wav_unproccessed=mtg.File(wav)
    formatted=wav_unproccessed.pprint()
    listed=formatted.split()
    del listed[:11]
    data_list=[]
    for i in listed:
        j=i.split('=')
        for k in j:
            data_list.append(k)
    del data_list[1:3]
    del data_list[-3]
    index_list=(data_list[::2])
    key_list=(data_list[1::2])
    final_list=zip(index_list,key_list)
    final_list=sorted(set(final_list))
    return final_list

第四步:

循环素材文件夹内的音频文件

输入文件目录,然后开始循环目录里面的每一个文件。 即把第三步中的结果根据文件的数量都打印一遍。

先来一个空的list

chunk=[]
adx_file_path='/Users/jiaweilu/Desktop/metadata_test/'
#循环文件夹里面的文件(如果你往里面丢除wav之外别的类型的文件的话,要在做处理。想要骚是有代价的)
for file in os.listdir(adx_file_path):
    file_name=[('name',os.path.basename(adx_file_path+file))]
    result=proccess_single_wav(adx_file_path+file)
    all_data=file_name+result
    chunk+=all_data
print(chunk)

再搞一个函数,输入上一步的总数据和要被等分的数目,输出小 chunk

def list_split(listA, n):
    for x in range(0, len(listA), n):
        every_chunk = listA[x: n+x]

        if len(every_chunk) < n:
            every_chunk = every_chunk + [None for y in range(n-len(every_chunk))]
        yield every_chunk
new_chunk=list(list_split(chunk, 10))

第五步:

是熊是猫拉出来溜溜(初始化熊猫数据框)

df=pd.DataFrame(data=new_chunk,columns={'1', '2','3','4','5','6','7','8','9','0'})

熊猫好处在哪?

  • 可以随意转成别的格式
  • 通过pivot 表格可以转化成新的数据框或者阵列
  • matplotlib 支持的漂亮的gui(秒杀excel,但还是没有reaper的各种theme好看)
  • 强大的功能(join reshape merge)随意耍
  • freeeeeeeeeeeeee
  • 不干音频也可以转行data science
  • 中国人不玩pandas 你像话么?
  • 2010年的库, 不停的更新,活跃的社区(是不是越来越像reaper了?)

先把columns的名字改回来

df.rename(columns = {'1':'Name','3':'comment','4':'custom','0':'album','6':'bpm','7':'real_or_fake','8':'content','9':'description','5':'key','2':'author'}, inplace = True)

用ilok 哦不 是iloc 把index的内容取出来

df.iloc[0]

用iat来改变cell的值

df.iat[1,1] = 'new_value'
df

再改回来,注意是这里的二维[x,y] x 是rows(横)y是columns(竖)

先横再竖
先横再竖
先横再竖
先横再竖

df.iat[1,1] = df.iat[2,1]
df

可以循环每个row,或者 columns,或者两个一起

如果你不想让每个单元格都是一个tuple,那么可以循环整个列表并删除第一个元素(COMM,REAPER这些东西)

for rowIndex, row in df.iterrows(): #iterate over rows
    for columnIndex, value in row.items():
        new_value=list(value)
        index_for_removal=0
        new_value.pop(index_for_removal)
        df.at[rowIndex,columnIndex]=new_value

数据框之间的对比

复制一份数据框

new_df=df.copy()

用iat来改变cell的值

new_df.iat[1,1] = [['new_value'],['another_value']]

用equals返回布尔值

df.equals(new_df)

compare返回具体df的区别

df.compare(new_df)

总之玩法太多。有兴趣的人可以上网去查https://pandas.pydata.org

鄙人非程序员,此举纯粹为了练手。我发现使用python的学习成本低,且可以做的事很多。希望大家指教。

第一部分完

2 个赞

支持!但这贴真得编辑一下,不然阅读起来真的不方便

1 个赞

原排版完全看不下去。

我擅作主张做了小改动,可以点击编辑按钮看到改动日志,有diff。

如果你有新排版或新内容也直接改就可以。

是 我回去研究一下 ,下一个一定要搞有排版的。 谢谢

哇 太够意思了。 谢谢谢谢谢

我改了一下脚本 (如果你不需要adx的话 可以把##里的内容删除掉tagsDataTranser.py (4.4 KB)

1 个赞