我需要比较 XP 机器上的两个文件夹。
这是一个广播电台,我们将所有音乐存储为高比特率 mp3,当从 CD 获取新歌曲时,它们是 wav。我需要能够比较 mp3 和 wav 文件夹的重复项(命名将相同,但文件扩展名除外)。目标是生成 wav 文件夹中没有 mp3 版本的项目列表。
安装了 Python 2.7,我的编码经验非常有限,使用 python。
所有帮助表示赞赏,即使它只是朝着正确的方向踢......谢谢。
我需要比较 XP 机器上的两个文件夹。
这是一个广播电台,我们将所有音乐存储为高比特率 mp3,当从 CD 获取新歌曲时,它们是 wav。我需要能够比较 mp3 和 wav 文件夹的重复项(命名将相同,但文件扩展名除外)。目标是生成 wav 文件夹中没有 mp3 版本的项目列表。
安装了 Python 2.7,我的编码经验非常有限,使用 python。
所有帮助表示赞赏,即使它只是朝着正确的方向踢......谢谢。
用于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']]
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))
这是一个基于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)))