我有多个音频文件,这些文件保存在我的工作目录中的多个子文件夹中。我有一个循环,它读取每个文件的第一分钟,然后将它们保存为新文件。
library(tuneR)
dir.create("New files")
FILES<-list.files(PATH, pattern = "audio", recursive = TRUE)
for(i in 1:length(FILES)){
OneMIN <- readWave(FILES[i], from = 0, to = 60, units = "seconds")
writeWave(OneMIN, filename = (file=paste0(FILES[i], "_1-min.wav")))
}
现在,这有几个问题;
1)新文件被调用,例如&#34; File1.wav_1-min.wav&#34;,以便我需要将它们重命名为&#34; File_1-min.wav&#34;
2)新文件在多个子文件夹中,然后我必须将它们复制到&#34;新文件&#34;文件夹使用循环外的其他步骤。
我有解决这些问题的解决方法,但我确信通过在循环中包含其他行,可以采用更优雅的方式来解决这些问题。我想:
1)剥去第一个&#39; .wav&#39;在文件名
中2)自动将它们保存到&#34;新文件&#34;夹
但是,我不知道如何解决这个问题。任何建议表示赞赏。感谢。
答案 0 :(得分:2)
file.path()
函数可用于将目录和文件名组合到单个文件路径中,而sub()
函数可以让您轻松修改文件名:
library(tuneR)
dir.create("New files")
FILES <- list.files(PATH, pattern = "audio", recursive = TRUE)
for(infile in FILES){
OneMIN <- readWave(infile, from = 0, to = 60, units = "seconds")
outfile <- file.path("New files", sub('.wav', '_1-min.wav', infile))
writeWave(OneMIN, filename=outfile)
}
另外,值得注意的是,在原始代码示例中,list.files()
函数只返回每个文件路径的文件名部分。
因此,您可能需要修改代码,使其类似于:
FILES <- list.files(PATH, pattern = "audio", recursive = TRUE, full.names=TRUE)
和
outfile <- file.path("New files", sub('.wav', '_1-min.wav', basename(infile)))
这将确保infile
和outfile
都指向正确的位置。
答案 1 :(得分:1)
我想我会发布我的解决方案,它借鉴了@Keith Hughitt的回答和@lmo的评论。感谢他们两人帮助解决我需要的问题。
for(i in 1:length(FILES)){
OneMIN <- readWave(FILES[i], from = 0, to = 60, units = "seconds")
FILE.OUT <- sub("\\.wav$", "_1 min.wav", FILES)
OUT.PATH <- file.path("New files", basename(FILE.OUT))
writeWave(OneMIN, filename = OUT.PATH[i])
}
正如两者所暗示的那样,由于路径问题,我遇到了错误。我在full.names = TRUE
作业中不需要FILES
,但我确实需要在循环中包含basename()
。
正如Keith在答案中所说,FILE.OUT
行不是绝对必要的,但它可以帮助我跟踪不同的步骤。