18917
18927
18929
...
我想在它们之前添加一个文件夹路径,然后抓住前2个字符并将其添加到文件中,然后在文件中添加一个'.jpg',这样它们最终会看起来像像这样:
路径/到/ foler / 18 / 18917.jpg
所以我编写了这个ruby代码:
folder = "/path/to/folder"
lines = File.readlines("values.csv")
images = lines.collect.to_s.gsub("\n", ".jpg,")
images.split(',').collect { |dogtag | puts "bad dog: #{folder}/#{dogtag[0,2]}/#{dogtag}" }
现在,这几乎可以工作,不起作用的部分是抓住前2个字符。我也尝试用引号外的方法(当然没有#{}),但它只产生一个空结果。
有人可以指出我的愚蠢吗?
最终我想要删除这些图片,但我猜测用'File.delete'替换上面的'puts'可以解决这个问题吗?
像往常一样,提前感谢花时间看这个。
答案 0 :(得分:4)
您似乎并不了解collect
的作用。
我会像这样重写你的代码片段:
File.read("values.csv").each do |line|
puts "bad dog: /path/to/folder/#{line[0,2]}/#{line.chomp}.jpg"
end
- 更新最后评论: -
如果您不想在删除文件之前使用if语句检查文件是否存在,则有两个选项(AFAIK)。
使用rescue
:
File.read("values.csv").each do |line|
begin
File.delete "/path/to/folder/#{line[0,2]}/#{line.chomp}.jpg"
rescue Errno::ENOENT
next
end
end
或者使用File
方法扩展delete_if_exists
类。您可以将它放在脚本的顶部:
class File
def self.delete_if_exists(f)
if exists?(f)
delete(f)
end
end
end
有了这个,你可以这样做:
File.read("values.csv").each do |line|
File.delete_if_exists "/path/to/folder/#{line[0,2]}/#{line.chomp}.jpg"
end