目录

问题描述

相关的知识

文件的读取

文件的写入

python中如何把list变成字符串

拆分列表split

代码演示

心得体会


问题描述

  • 最近我在学习kaldi,纯小白新手上路。于是在做kaldi的数据准备的时候,我发现cnceleb1数据集数目不太正确,原来是train集包含了test集。按照常理来说train, test, enroll应该是不相交的。所以我目前的状况是不合理的。于是我需要将ceceleb1的数据进行过滤,把test的数据从train剥离出来。
  • 自然而然地就冒出来第一个问题,也就是今天我要分享的主角:“如何将一个文件从另一个文件中删除,实现文件的过滤”。我就借用我最近做的例子来分享解决办法。
  • 关于文件

        我给大家看看我的文件长什么样子,这样方便接下来的介绍

python 删除pdf 内容 如何在python中删除文件_python 删除pdf 内容

 上图是tarin的wav.scp ,一共126533条数据

python 删除pdf 内容 如何在python中删除文件_语音识别_02

上图是test集里面的wav.scp,一共17778条数据

很明显,这些是关于数据的信息,我要做的就是对这些信息进行过滤。把test出现的所有信息从train里面删去。

这里要注意的是,删除不是原封不动的删除,在test出现的id所对应的片段,train集里面都要删除。 

        

相关的知识

文件的读取
 

我参考了这篇文章,讲的足够的清晰

文件的写入

        参考这篇文章学习文件的写入。看一下几分钟就能学会。

        

python中如何把list变成字符串

        参考以下这篇文章https://www.python51.com/jc/15833.html,很清晰方法也很简单

拆分列表split

        这篇文章讲了list切片和split的不同用法,我看完很有收获


        再结合这篇文章,你很快就会明白如何进行切片(强烈推荐)

https://qa.1r1g.com/sf/ask/468721921/

代码演示

我的思路是先打开文件,然后把文件变成list,用list的方法处理文件,最后在整个写入文件。

好了下面就开始进行代码

  • wav.scp文件的过滤
wavtest = open(r"D:\cnceleb1_train\test\wav.scp",'r')#打开文件
wavtestlist = list(wavtest)#将文件转成list表单


spk = []#建立一个叫做spk的空表,用于填写说话人名单
for i in wavtestlist:#遍历完成,此时spk是一个只有说话人id的表单
    spk.append(i.split()[0].split('-')[0])

wav = open(r"D:\cnceleb1_train\wav.scp",'r')#打开文件
wavlist = list(wav)#将文件转成list表单


str = []#建立一个空表

for line in wavlist:#遍历wavlist的每一行
    if line.split()[0].split('-')[0] not in spk:#如果wavlist的这一行给对应的说话人id不在spk表单里面,就把这一行信息加入到新建的表单当中
        str.append(line)


with open(r"D:\cnceleb1_train\wavnew.scp",'w')as file:#输出文件
            file.write(''.join(str))
            file.close()

这样便可以生成一个新的文件wavnew.scp , 这就是我们过滤之后的文件。新文件不包括test里面所有说话的所有说话片段。

心得体会

最开始,我理解错意思了,我以为只用把test集的所有数据从train里面剔除出去就好,所以我第一遍筛选虽然成功了,但是没有满足的我的项目需求。

可见,只要把细节学习到位,功能都可以自己改进。