比较文件夹内容

3
我需要比较XP计算机上的两个文件夹。
这是一个广播电台,我们将所有音乐存储为高比特率mp3格式,当从CD获取新歌曲时,它们以wav格式存储。我需要能够比较mp3和wav文件夹中的重复项(命名除文件扩展名外完全相同)。目标是生成一个列表,其中列出了wav文件夹中没有mp3版本的项目。
Python 2.7已安装,我非常有限的编码经验是使用Python。
非常感谢您的帮助,即使只是指导方向...谢谢。

1
从2个文件夹中读取文件名,使用正则表达式或简单的indexOf处理文件名以删除扩展名,将文件名放入与之对应的集合中(我们使用2个集合,每个集合对应一个文件夹)。然后遍历其中一个集合,并查找文件名是否存在于另一个集合中。我没有经常使用Python,但应该有某种类型的集合,它在内部是一棵树或哈希表。 - nhahtdh
@nhahtdh,赞一个发布指导而不是解决方案的做法。 - tuxuday
3个回答

6

使用os.listdir获取文件夹内容,使用os.path.splitext确定基础名称:

import os
wavs = set(os.path.splitext(fn)[0] for fn in os.listdir('/path/to/wavs'))
mp3s = set(os.path.splitext(fn)[0] for fn in os.listdir('/path/to/mp3s'))
must_convert = wavs - mp3s

如果您想汇总多个文件夹中的mp3和wav文件(但不是递归),则必须存储基本名称和完整文件名:

import os,collections
files = collections.defaultdict(dict)
for d in ['/path/to/wavs', '/more/wavs', '/some/mp3s', '/other/mp3s']:
    for f in os.listdir(d):
        basename,ext = os.path.splitext(f)
        files[ext][basename] = os.path.join(d, f)
files_to_convert = [fn for basename,fn in files['.wav'].items()
                       if basename not in files['.mp3']]

只是个人好奇:即使存在嵌套的子文件夹,这个方法是否有效?我的意思是,它是否会递归地在子文件夹中查找文件? - Nadir Sampaoli
@nadirs 不需要(因为递归版本不会像简洁的三行代码那样好看)。你需要递归比较吗? - phihag
@phihag 不,我不是楼主,我只是对此很好奇。谢谢你的回答。 - Nadir Sampaoli
这对我很有效。但是,如果mp3文件在不止一个文件夹中(而不是子文件夹),那么在将它们与wavs进行比较之前,我该如何汇总所有mp3文件? - user1192965
@floatingshed 然后它变得更加复杂。已更新该问题的解决方案。 - phihag
显示剩余2条评论

2
    import os
    wav=[os.path.splitext(x)[0] for x in os.listdir(r'C:\Music\wav') if os.path.splitext(x)[1]=='.wav']
    mp3=[os.path.splitext(x)[0] for x in os.listdir(r'C:\Music\mp3') if os.path.splitext(x)[1]=='.mp3']  

   #here wav is a list names of only those files whose extension is .wav 
   #here mp3 is a list names of only those files whose extension is .mp3 

    print(set(wav)-set(mp3))

1

这里有一个递归的解决方案,略基于phihag答案

import os
sets = {}
for dirname in 'mp3_folder', 'wav_folder':
    sets[dirname] = set()
    for path, dirs, files in os.walk(dirname):
        sets[dirname].update(os.path.join(path, os.path.splitext(fn)[0]).lstrip(dirname) for fn in files)
must_convert = sets['mp3_folder']-sets['wav_folder']
print('\n'.join(sorted(must_convert)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接