【问题标题】:Automate (or looping) moving certain files to subdirectories by name自动(或循环)将某些文件按名称移动到子目录
【发布时间】:2020-06-09 15:55:29
【问题描述】:

我有 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)。连接的文件也应该在一个单独的目录中,以包含 directory1 的所有拼接文件。

目前,我使用两个 python 脚本手动完成所有操作,因为我每小时都在物理上更改数字和间隔(我知道,这很愚蠢),因此变得非常麻烦:

脚本 1(在一小时内将所有文件移动到另一个目录;在这段特殊的代码中,我找到了凌晨 1 点到凌晨 2 点之间的所有剪辑,并将它们移动到 directory1 中的子目录这样子目录只包含从凌晨 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 - 抱歉,这里是初学者。

【问题讨论】:

  • 看看 os.walk 写些聪明的东西

标签: python loops subdirectory startswith file-move


【解决方案1】:

我很确定您可以使用 os.walk() 来遍历您的目录和文件。看看这个sn-p:

import os
rootdir = '.'
for root, dirs, files in os.walk(rootdir):
    print(root, dirs, files)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    相关资源
    最近更新 更多