【问题标题】:File.open('*.txt') in Ruby? [duplicate]Ruby 中的 File.open('*.txt')? [复制]
【发布时间】:2016-02-14 05:21:53
【问题描述】:

我有一个脚本,我在其中迭代一些目录并在那里创建文件并将一些字符串放入创建的文件中。在我创建文件的目录中,存在一些我想打开并搜索一些特定字符串以将它们复制到我创建的文件中的其他文件。此现有文件具有“.sln”扩展名。

有没有一种简单的方法可以在我创建文件的那一刻告诉 Ruby,打开现有的 .sln 文件并解析它。我想像:

File.open('*.sln', 'r')

我尝试过这样的事情:

sln_files = Dir.glob('*.sln', 'r')
File.open(sln_files)

还有这个方法:

Dir["/path/to/search/**/*.sln"]

但它给了我文件的完整路径。我只需要文件名

有什么想法吗?我希望可以在 File.open 方法中使用通配符

所以我在一个已经存在的主题中找到了解决方案(使用 Ruby 从文件夹中获取所有文件的名称)。那是:

files = Dir["/work/myfolder/**/*.txt"]

files.each do |file_name|
  if !File.directory? file_name
    puts file_name
    File.open(file_name) do |f|
      f.each_line do |line|
        if line =~ /banco1/
          puts "Found: #{line}"
        end
      end
    end
  end
end

【问题讨论】:

  • 你不能使用这样的通配符。 Ruby 以及我曾经使用过的所有其他语言都需要一个明确的文件名。如果有多个文件要处理,我们会获取这些名称并循环它们。如果我们不知道文件的基本名称,只知道扩展名,我们必须搜索与该扩展名或模式匹配的文件,然后遍历结果数组。
  • @theTinMan 这对我来说是一个典型的用例。例如,如果您的文件有时间戳,则需要某种通配符。
  • 如果你有一个文件的完整路径名,那么你应该使用File.basename 来提取文件名.ext。但是,实际上,这一切都在 File 中得到了很好的记录,并且在 Stack Overflow 和互联网上被多次报道。
  • 用例可能是,但处理它的代码除了将通配符传递给open之外仍然需要做一些事情。
  • 它涵盖了处理通配符的部分问题。由于引用了File.open,所以关于打开文件的部分显然被覆盖了。

标签: ruby-on-rails ruby rake


【解决方案1】:

一个解决方案可能是..

Dir.glob('*.sln').each do |filename|
  File.open(filename, 'r') do |file|
    # reading ...
  end
end

如果您只想要第一个文件,或者您确定只有一个文件,您可以创建一个辅助方法。

def with_open_file(pattern)
  filename = Dir.glob('*.sln').first
  File.open(filename, 'r') { |f| yield(f) }
end

with_open_file('*.sln') do |file|
  # reading ...
end

【讨论】:

  • 嗨,我在“使用 Ruby 从文件夹中获取所有文件的名称”主题中找到了正确的解决方案
猜你喜欢
  • 1970-01-01
  • 2011-06-15
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
相关资源
最近更新 更多