遍历目录并从rails中的ruby文件中读取

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

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

谢谢!

杰克的答案已经足够好了,但是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} 

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

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

您也可以在这里使用tap:

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

以下基于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