自动(或循环)按名称将某些文件移动到子目录中去

问题描述 投票:0回答:1

我有207个目录,里面都是.WAV文件,每个目录里都有一定数量的文件,记录了某一天的情况(各个目录的数量不一样)。目录的名称只是YYYYMMDD格式的日期,文件名已经被修改,所以每个目录中的文件名都是'HHMMSS.WAV'格式(录制时间,即024545.WAV)。每个目录都有不同的录音时间,比如目录1中的文件是某一天凌晨02点到11点之间录制的,而目录2中的文件是某一天上午11点到下午6点之间录制的,等等。

我需要将文件按小时间隔进行串联;因此,例如,在目录1中,有1920个片段,我需要将每个小时间隔中的文件移到一个单独的目录中--因此,实际上,目录1将有x个新的子目录,其中x是目录1中存在的小时间隔的数量(即。 即目录1_00-01代表目录1中所有记录在凌晨00点到01点之间的文件,目录1_01-02代表目录1中所有记录在凌晨01点到02点之间的文件,等等,如果目录1中有6个小时间隔,我将需要6个子目录,每个小时间隔一个)。) 我需要这些独立的目录,因为这是我想出的唯一方法,可以把.WAV文件连在一起(见脚本2)。连接后的文件也应该在一个单独的目录中,以包含目录1的所有缝合文件。

目前,我的做法是 手动 使用了两个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 "保存在目录1的另一个子目录中,名为 "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 "应该包含目录1中每个小时间隔的所有文件。

谁能帮帮我?自动 这个过程,所以我不需要为所有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 - 对不起,我是个初学者。

python loops subdirectory startswith file-move
1个回答
0
投票

我确信你可以用os.walk()来巡视你的目录和文件。看看这个片段。

import os
rootdir = '.'
for root, dirs, files in os.walk(rootdir):
    print(root, dirs, files)
© www.soinside.com 2019 - 2024. All rights reserved.