我有 207 个充满 .WAV 文件的目录,其中每个目录包含一定数量的一天记录的文件(数量因目录而异)。目录的名称只是 YYYYMMDD 格式的日期,并且文件名已经被修改,因此它们的名称在每个目录中都是 'HHMMSS.WAV' 格式(录制的时间,即 024545.WAV)。每个目录都有不同的记录时间,例如,directory1 包含某天凌晨 2 点到 11 点之间录制的文件,而 directory2 包含某天上午 11 点到晚上 6 点之间录制的文件,等等。
我需要按小时间隔连接文件;例如,在 directory1 中有 1920 个剪辑,我需要将每个小时间隔的文件移动到一个单独的目录中——因此有效地,directory1 将有 x 个新子目录,其中 x 是存在的每小时间隔数在目录 1 中(即目录 1_00-01 用于目录 1 中在凌晨 00 点至凌晨 1 点之间记录的所有文件,目录 1_01-02 用于目录 1 中在凌晨 1 点至凌晨 2 点之间记录的所有文件等,如果目录 1 中有 6 小时间隔,我将需要 6 个子目录,每个小时间隔一个)。我需要拥有这些单独的目录,因为这是我弄清楚如何将 .WAV 文件连接在一起的唯一方法(请参阅脚本 2)。
目前,我正在使用两个 python 脚本手动执行所有操作,并且由于我每小时都在物理上更改数字和间隔(我知道,这很愚蠢),这变得非常麻烦:
脚本 1(在一小时内将所有文件移动到另一个目录;在这段特定的代码中,我找到了凌晨 1 点到凌晨 2 点之间的所有剪辑,并将它们移动到目录 1 中的子目录,以便子目录仅包含从上午 1 点到凌晨 2 点):
import os
import shutil
origin = r'PATH/TO/DIRECTORY1’
destination = r'PATH/TO/DIRECTORY1/DIRECTORY1_01-02'
startswith_ = '01'
[os.rename(os.path.join(origin,i), os.path.join(destination, i)) for i in os.listdir(origin) if i.startswith(startswith_)]
脚本 2(连接文件夹中的所有文件并将输出写入另一个目录;在这段特定的代码中,我位于脚本 1 的子目录中,连接其中的所有文件,并保存输出文件“directory1_01- 02.WAV”在 directory1 的另一个子目录中,称为“directory1_concatenated”):
import os
import glob
import ffmpeg
from pydub import AudioSegment
os.chdir("PATH/TO/DIRECTORY1/DIRECTORY1_01-02'")
wav_segments = [AudioSegment.from_wav(wav_file) for wav_file in glob.glob("*.wav")]
combined = AudioSegment.empty()
for clip in wav_segments:
combined += clip
combined.export(‘PATH/TO/DIRECTORY1/DIRECTORY1_CONCATENATED/DIRECTORY1_01-02.WAV', format = “wav)
这个想法是,到最后,“directory1_concatenated”应该包含 directory1 内每个小时间隔的所有连接文件。
任何人都可以帮助我以某种方式自动化这个过程,这样我就不必为所有 207 个目录手动操作了吗?如果我没有很好地解释自己,请随时询问有关该过程的任何问题(对不起!)。
编辑: 由于 os.walk 的建议,想出了如何使脚本 1 自动化运行 :) 现在我有一个关于脚本 2 的后续问题。如何增加保存的文件以便对其进行编号?当我尝试以下操作时,我收到“无效语法”错误。
rootdir = 'PATH/TO/DIRECTORY1'
for root, dirs, files in os.walk(rootdir):
for i in dirs:
wav_segments = [AudioSegment.from_wav(wav_file) for wav_file in glob.glob("*.wav")]
combined = AudioSegment.empty()
for clip in wav_segments:
combined += clip
combined.export("PATH/TO/DIRECTORY1/DIRECTORY1_CONCATENATED/DIRECTORY1_%s.wav", format = "wav", % i)
i++
我一直在阅读其他一些堆栈溢出问题,但它们似乎都处理特定文件?或者也许我还没有完全理解 os.walk - 抱歉,这里是初学者。