遍历目录并从轨道上的ruby中的文件中读取

时间:2011-05-29 05:18:19

标签: ruby-on-rails ruby ruby-on-rails-3

我在弄清楚如何1)遍历目录和2)获取每个文件(.txt)并将其保存为字符串时遇到了一些麻烦。我显然对ruby和rails都很陌生。

我知道我可以使用f=File.open("/path/*.txt")保存文件,然后用puts f.read输出它,但我宁愿将其保存为字符串,而不是.txt,并且不知道如何为每个文件保存文件。

谢谢!

4 个答案:

答案 0 :(得分:3)

您可以使用Dir.glob并映射文件名,使用IO.read将每个文件名读入字符串。这是一些伪代码:

file_names_with_contents = Dir.glob('/path/*.txt').inject({}){|results, file_name| result[file_name] = IO.read(file_name)}

答案 1 :(得分:2)

你也可以使用点击这里:

file_names_with_contents = {}.tap do |h|
  Dir.glob('/path/*.txt').each{|file_name| h[file_name] = IO.read(file_name)}
end

答案 2 :(得分:2)

以下基于python os.walk函数,它返回一个元组列表:( dirname,dirs,files)。由于这是ruby,因此您将获得一个数组列表: [dirname,dirs,files]。这比尝试递归遍历目录更容易处理。要运行代码,您需要提供demo_folder。

def walk(dir)
  dir_list = []
  def _walk(dir, dir_list)
    fns = Dir.entries(dir)
    dirs = []
    files = []
    dirname = File.expand_path(dir)
    list_item = [dirname, dirs, files]
    fns.each do |fn|
      next if [".",".."].include? fn
      path_fn = File.join(dirname, fn)
      if File.directory? path_fn
        dirs << fn
        _walk(path_fn, dir_list)
      else
        files << fn
      end
    end
    dir_list << list_item
  end

  _walk(dir, dir_list)
  dir_list
end

if __FILE__ == $0

  require 'json'

  dir_list = walk('demo_folder')
  puts JSON.pretty_generate(dir_list)
end

答案 3 :(得分:1)

杰克的答案已经足够好了,但是each_with_object会让它稍微短一点。我也把它递归了。

def read_dir dir
  Dir.glob("#{dir}/*").each_with_object({}) do |f, h|
    if File.file?(f)
      h[f] = open(f).read
    elsif File.directory?(f)
      h[f] = read_dir(f)
    end
  end
end

当目录如下:

--+ directory_a
  +----file_b
  +-+--directory_c
  | +-----file_d
  +----file_e

然后

read_dir(directory_a)

将返回:

{file_b => contents_of_file_b,
 directory_c => {file_d => contents_of_file_d},
 file_e => contents_of_file_e}