在R循环中命名文件

时间:2017-01-18 15:34:32

标签: r loops audio

我有多个音频文件,这些文件保存在我的工作目录中的多个子文件夹中。我有一个循环,它读取每个文件的第一分钟,然后将它们保存为新文件。

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;夹

但是,我不知道如何解决这个问题。任何建议表示赞赏。感谢。

2 个答案:

答案 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)))

这将确保infileoutfile都指向正确的位置。

答案 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行不是绝对必要的,但它可以帮助我跟踪不同的步骤。