Ruby 知道文件是否为YAML

Ruby 知道文件是否为YAML,ruby,yaml,Ruby,Yaml,我希望ruby的YAML.load_file(foo)在foo不是YAML文件时返回null。但我有一个例外: did not find expected alphabetic or numeric character while scanning an alias at line 3 column 3 (Psych::SyntaxError) from /usr/lib/ruby/2.4.0/psych.rb:377:in `parse_stream' from /usr/li

我希望ruby的
YAML.load_file(foo)
foo
不是YAML文件时返回null。但我有一个例外:

did not find expected alphabetic or numeric character while scanning an alias at line 3 column 3 (Psych::SyntaxError)
    from /usr/lib/ruby/2.4.0/psych.rb:377:in `parse_stream'
    from /usr/lib/ruby/2.4.0/psych.rb:325:in `parse'
    from /usr/lib/ruby/2.4.0/psych.rb:252:in `load'
    from /usr/lib/ruby/2.4.0/psych.rb:473:in `block in load_file'
    from /usr/lib/ruby/2.4.0/psych.rb:472:in `open'
    from /usr/lib/ruby/2.4.0/psych.rb:472:in `load_file'
    from ./select.rb:27:in `block in selecting'
    from ./select.rb:26:in `each'
    from ./select.rb:26:in `selecting'
    from ./select.rb:47:in `block (2 levels) in <main>'
    from ./select.rb:46:in `each'
    from ./select.rb:46:in `block in <main>'
    from ./select.rb:44:in `each'
    from ./select.rb:44:in `<main>'

当我捕获异常时,bucle不会继续推送列表中的元素。

Psych::SyntaxError由引发,其源代码是用C编写的。因此,除非您想使用C,否则无法用Ruby为该方法编写补丁以防止引发异常

尽管如此,您仍然可以挽救异常,如下所示:

begin
  foo = YAML.load_file("not_yaml.txt")
rescue Psych::SyntaxError => error
  puts "bad yaml"
end

Psych::SyntaxError
由引发,其源代码是用C编写的。因此,除非您想使用C,否则无法用Ruby为该方法编写修补程序以防止引发异常

尽管如此,您仍然可以挽救异常,如下所示:

begin
  foo = YAML.load_file("not_yaml.txt")
rescue Psych::SyntaxError => error
  puts "bad yaml"
end

简单的回答是:你不能

因为YAML只是一个文本文件,所以了解给定文本文件是否为YAML的唯一方法是对其进行解析。解析器将尝试解析该文件,如果该文件不是有效的YAML,它将引发错误

错误和异常是Ruby的常见部分,尤其是在IO领域。没有理由害怕他们。您可以轻松地从他们手中解救出来,继续前行:

begin
  yaml = YAML.load_file(foo)
rescue Psych::SyntaxError => e
  # handle the bad YAML here
end
您提到以下代码将无法工作,因为您需要处理目录中的多个文件:

def foo
  mylist = []
  for d in (directory - excludinglist)
    begin
      info = YAML.load_file(d)
      if info
        if info.has_key?('output')
          if info['output'].has_key?(word)
            mylist.push(d)
          end 
        end
      end 
    rescue Psych::SyntaxError => error 
      return [] 
    end 
  return mylist
end
这里唯一的问题是,当您遇到错误时,您会通过提前从函数返回来响应。如果不返回,for循环将继续,您将获得所需的功能:

def foo
  mylist = []
  for d in (directory - excludinglist)
    begin
      info = YAML.load_file(d)
      if info
        if info.has_key?('output')
          if info['output'].has_key?(word)
            mylist.push(d)
          end 
        end
      end 
    rescue Psych::SyntaxError => error 
      # do nothing!
      # puts "or your could display an error message!"
    end
  end
  return mylist
end

简单的回答是:你不能

因为YAML只是一个文本文件,所以了解给定文本文件是否为YAML的唯一方法是对其进行解析。解析器将尝试解析该文件,如果该文件不是有效的YAML,它将引发错误

错误和异常是Ruby的常见部分,尤其是在IO领域。没有理由害怕他们。您可以轻松地从他们手中解救出来,继续前行:

begin
  yaml = YAML.load_file(foo)
rescue Psych::SyntaxError => e
  # handle the bad YAML here
end
您提到以下代码将无法工作,因为您需要处理目录中的多个文件:

def foo
  mylist = []
  for d in (directory - excludinglist)
    begin
      info = YAML.load_file(d)
      if info
        if info.has_key?('output')
          if info['output'].has_key?(word)
            mylist.push(d)
          end 
        end
      end 
    rescue Psych::SyntaxError => error 
      return [] 
    end 
  return mylist
end
这里唯一的问题是,当您遇到错误时,您会通过提前从函数返回来响应。如果不返回,for循环将继续,您将获得所需的功能:

def foo
  mylist = []
  for d in (directory - excludinglist)
    begin
      info = YAML.load_file(d)
      if info
        if info.has_key?('output')
          if info['output'].has_key?(word)
            mylist.push(d)
          end 
        end
      end 
    rescue Psych::SyntaxError => error 
      # do nothing!
      # puts "or your could display an error message!"
    end
  end
  return mylist
end

如果内容不是有效的YAML,您将如何区分
null
null
的有效内容。也就是说,如果YAML文档是空的,或者只包含一个标量,表示为
null
(即
~
null
null
null
)?如果内容不是有效的YAML,如何区分
null
。也就是说,如果YAML文档是空的,或者只包含一个标量,表示为
null
(即
~
null
null
null
)?如果这样做,则无法处理目录中的所有文档。我的代码看起来像这样`mylist=Array.new mylist=[]用于d in(目录-排除glist)begin info=YAML.load_file(d)if info if info if info.has_key?('output')if info['output'].has_key?(word)mylist.push(d)end-end-rescue-Psych::SyntaxError=>错误返回[]end end return mylist`@somenxavier您是否可以编辑原始问题以包含格式正确的代码示例?完成。现在你能为我的问题提供一些解决方案吗?Thanksit需要一个
end
for
for
如果我这样做,那么我就无法处理目录中的所有文档。我的代码看起来像这样`mylist=Array.new mylist=[]用于d in(目录-排除glist)begin info=YAML.load_file(d)if info if info if info.has_key?('output')if info['output'].has_key?(word)mylist.push(d)end-end-rescue-Psych::SyntaxError=>错误返回[]end end return mylist`@somenxavier您是否可以编辑原始问题以包含格式正确的代码示例?完成。现在你能为我的问题提供一些解决方案吗?Thanksit需要一个
end
for