我在弄清楚如何1)遍历目录和2)获取每个文件(.txt)并将其保存为字符串时遇到了一些麻烦。我显然对ruby和rails都很陌生。
我知道我可以使用f=File.open("/path/*.txt")
保存文件,然后用puts f.read
输出它,但我宁愿将其保存为字符串,而不是.txt,并且不知道如何为每个文件保存文件。
谢谢!
答案 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}