如何从目录中逐行打开和读取文件?

时间:2013-02-13 14:43:30

标签: ruby

我正在尝试从包含大约200个文本文件的目录中读取文件行,但是,我不能让Ruby逐行读取它们。我之前使用过一个文本文件,而不是从目录中读取它们。

我可以将文件名作为字符串,但我正在努力打开它们并阅读每一行。

以下是我尝试过的一些方法。

方法1:

def readdirectory
  @filearray = []
Dir.foreach('mydirectory') do |i|
 # puts i.class
    @filearray.push(i)
    @filearray.each do |s|
     # @words =IO.readlines('s')
      puts s
    end#do
 #   puts @words
end#do

end#readdirectory 

方法2:

def tryread
 Dir.foreach('mydir'){
   |x| IO.readlines(x)
 }

end#tryread

方法3:

def tryread
 Dir.foreach('mydir') do |s|
   File.readlines(s).each do |line|
               sentence =line.split
   end#inner do

 end #do
end#tryread

每次尝试打开循环函数传递的字符串时,我都会收到错误:

Permission denied - . (Errno::EACCES)

4 个答案:

答案 0 :(得分:0)

sudo ruby reader.rb或您的文件名是什么。

由于权限是基于进程的,因此如果进程读取没有权限,则无法读取具有提升权限的文件。

只有解决方案要么以更多权限运行脚本,要么调用另一个已经运行且具有更高权限的进程为您阅读。

答案 1 :(得分:0)

感谢所有回复,我做了一些试验和错误并让它发挥作用。这是我使用的语法

    Dir.entries('lemmatised').each do |s|
      if !File.directory?(s)

        file = File.open("pathname/#{s}", 'r')

        file.each_line do |line|
          count+=1
          @words<<line.split(/[^a-zA-Z]/)
        end # inner do
            puts @words
      end #if
    end #do

答案 2 :(得分:0)

试试这个,

#it'll hold the lines
f = []

#here test directory contains all the files,
#write the path as per the your computer,
#mine's as you can see, below

#fetch filenames and keep in sorted order
a = Dir.entries("c:/Users/lordsangram/desktop/test")

#read the files, line by line
Dir.chdir("c:/Users/lordsangram/desktop/test")

#beginning for i = 1, to ignore first two elements of array a,
#which has no associated file names
2.upto(a.length-1) do |i|
    File.readlines("#{a[i]}").each do |line|
        f.push(line)
    end  
end

f.each do |l|
    puts l
end

答案 3 :(得分:0)

@the Tin Man - &gt;你需要避免处理“。”和{..}列在Dir.foreach中并给出权限被拒绝错误。一个简单的if应该可以修复所有的apporo。

Dir.foreach(ARGV[0]) do |f|
  if f != "." and f != ".."
    # code to process file
    # example
    # File.open(ARGV[0] + "\\" + f) do |file|
    # end
  end
end