在 Lua 中查看文件目录

Posted

技术标签:

【中文标题】在 Lua 中查看文件目录【英文标题】:Looking in file directories in Lua 【发布时间】:2021-05-25 02:36:18 【问题描述】:

我正在尝试为一个研究项目调整一些代码,但以前从未在 Lua 中编写过代码。结果我不确定路径和加载是如何工作的。我有这些 CSV 文件,其中包含蛋白质的信息,并且计划将它们转换为神经网络的图像。但是我不确定将这些 CSV 文件放入哪些属性和文件目录。有人有什么见解吗?

local M=

require 'paths';
torch.manualSeed(123)

local function LoadCSV(proteinName)
    local file = io.open(proteinName, 'r')
    local header = file:read()
    local dat = 
    for l in file:lines() do
        local row = l:split(',')
        table.insert(dat,row)
    end
    return torch.Tensor(dat)
end

function M.Maper(cancerType)
    local pros = paths.dir('Data/' .. cancerType)
    os.execute("mkdir " .. "Data/" .. cancerType .. "_Map")
    table.remove(pros,1)
    table.remove(pros,1)
    table.sort(pros)
    local n = #pros
    
    for i=1,n,3 do
        local tens = 
        print(pros[i])
        for j=1,3 do
            local map = torch.zeros(16,200,200)
            gene = LoadCSV('Data/' .. cancerType .. '/' .. pros[i+j-1])
            atoms = gene:size(1)
            for a=1,atoms do
                --print(gene[a][17] , gene[a][18])
                map[ , math.min(gene[a][17]+1,200), math.min(gene[a][18]+1,200) ] = gene[ a, 1,16 ]
            end
            tens[j] = map:clone()
        end
        torch.save('Data/' .. cancerType .. '_Map/' .. pros[i]:sub(1,4) .. '.dat',tens)
    end
end

local function Shuffle(...)
    local args = ...
    local n = #args[1]
    local count = 0
    count=(torch.type(n)=='number' and n or n[1]) 
    for t=1,count do
        local k = math.random(count)
        for i,v in ipairs... do
            v[t],v[k] = v[k],v[t]
        end
    end
    return ...
end

function M.DataCollect(positive,negative,neutral)
    local posProtein = paths.dir('Data/' .. positive)
    table.remove(posProtein,1)
    table.remove(posProtein,1)
    local negProtein = paths.dir('Data/' .. negative)
    table.remove(negProtein,1)
    table.remove(negProtein,1)
    --local nutProtein = paths.dir('Data/' .. neutral)
    --table.remove(nutProtein,1)
    --table.remove(nutProtein,1)
    local label = torch.zeros(#posProtein+#negProtein)
    local allProtein = 
    local index=1
    for i=1,#posProtein do
        table.insert(allProtein, 'Data/' .. positive .. '/' .. posProtein[i])
        label[index]=1
        index=index+1
    end

    for i=1,#negProtein do
        table.insert(allProtein, 'Data/' .. negative .. '/' .. negProtein[i])
    end

    --for i=1,#nutProtein do
    --  table.insert(allProtein, 'Data/' .. neutral .. '/' .. nutProtein[i])
    --end

    _ = Shuffle(allProtein,label)

    return allProtein,label
end

function M.Slice(tbl, first, last, step)
  local sliced = 

  for i = first or 1, last or #tbl, step or 1 do
    sliced[#sliced+1] = tbl[i]
  end

  return sliced
end

function M.Fetch(names,h,w)
  local pros = torch.Tensor(3,#names,16,h,w)
  local threads = require 'threads'
  local pool = threads.Threads(4)
  for i=1,#names do
    pool:addjob(function()
      local temp = torch.load(names[i])
      return i,temp
    end,
    function(id,pr)
    --print(pr,pros:size())
      pros[ 1, id, , ,  ] = pr[1]:clone()
      pros[ 2, id, , ,  ] = pr[2]:clone()
      pros[ 3, id, , ,  ] = pr[3]:clone()
    end
    )
  end
  pool:synchronize()
  pool:terminate()
  return pros
end

function M.Dataset(proteins,labels,meani,stdvi)
    local dataset = 
    dataset.data = proteins
    dataset.label = labels
    setmetatable(dataset,__index = function(t, i) 
                    return 
                        t.data[i],
                        t.label[i]
                     
                end
    );
    
    function dataset:size() 
        return self.data:size(1) 
    end
    
    local mean = torch.zeros(16)
    local stdv  = torch.zeros(16)

     if meani~=nil then
       for i=1,16 do
       dataset.data:select(3, i):add(-meani[i])
       dataset.data:select(3, i):div(stdvi[i])
       end
     else   
         for i=1,16 do
         mean[i] = dataset.data:select(3, i):mean() 
         dataset.data:select(3, i):add(-mean[i])
         stdv[i] = dataset.data:select(3, i):std()
         dataset.data:select(3, i):div(stdv[i])
         end
     end

    return dataset,mean,stdv
end

return M
local M=

require 'paths';
torch.manualSeed(123)

local function LoadCSV(proteinName)
    local file = io.open(proteinName, 'r')
    local header = file:read()
    local dat = 
    for l in file:lines() do
        local row = l:split(',')
        table.insert(dat,row)
    end
    return torch.Tensor(dat)
end

function M.Maper(cancerType)
    local pros = paths.dir('Data/' .. cancerType)
    os.execute("mkdir " .. "Data/" .. cancerType .. "_Map")
    table.remove(pros,1)
    table.remove(pros,1)
    table.sort(pros)
    local n = #pros
    
    for i=1,n,3 do
        local tens = 
        print(pros[i])
        for j=1,3 do
            local map = torch.zeros(16,200,200)
            gene = LoadCSV('Data/' .. cancerType .. '/' .. pros[i+j-1])
            atoms = gene:size(1)
            for a=1,atoms do
                --print(gene[a][17] , gene[a][18])
                map[ , math.min(gene[a][17]+1,200), math.min(gene[a][18]+1,200) ] = gene[ a, 1,16 ]
            end
            tens[j] = map:clone()
        end
        torch.save('Data/' .. cancerType .. '_Map/' .. pros[i]:sub(1,4) .. '.dat',tens)
    end
end

local function Shuffle(...)
    local args = ...
    local n = #args[1]
    local count = 0
    count=(torch.type(n)=='number' and n or n[1]) 
    for t=1,count do
        local k = math.random(count)
        for i,v in ipairs... do
            v[t],v[k] = v[k],v[t]
        end
    end
    return ...
end

function M.DataCollect(positive,negative,neutral)
    local posProtein = paths.dir('Data/' .. positive)
    table.remove(posProtein,1)
    table.remove(posProtein,1)
    local negProtein = paths.dir('Data/' .. negative)
    table.remove(negProtein,1)
    table.remove(negProtein,1)
    --local nutProtein = paths.dir('Data/' .. neutral)
    --table.remove(nutProtein,1)
    --table.remove(nutProtein,1)
    local label = torch.zeros(#posProtein+#negProtein)
    local allProtein = 
    local index=1
    for i=1,#posProtein do
        table.insert(allProtein, 'Data/' .. positive .. '/' .. posProtein[i])
        label[index]=1
        index=index+1
    end

    for i=1,#negProtein do
        table.insert(allProtein, 'Data/' .. negative .. '/' .. negProtein[i])
    end

    --for i=1,#nutProtein do
    --  table.insert(allProtein, 'Data/' .. neutral .. '/' .. nutProtein[i])
    --end

    _ = Shuffle(allProtein,label)

    return allProtein,label
end

function M.Slice(tbl, first, last, step)
  local sliced = 

  for i = first or 1, last or #tbl, step or 1 do
    sliced[#sliced+1] = tbl[i]
  end

  return sliced
end

function M.Fetch(names,h,w)
  local pros = torch.Tensor(3,#names,16,h,w)
  local threads = require 'threads'
  local pool = threads.Threads(4)
  for i=1,#names do
    pool:addjob(function()
      local temp = torch.load(names[i])
      return i,temp
    end,
    function(id,pr)
    --print(pr,pros:size())
      pros[ 1, id, , ,  ] = pr[1]:clone()
      pros[ 2, id, , ,  ] = pr[2]:clone()
      pros[ 3, id, , ,  ] = pr[3]:clone()
    end
    )
  end
  pool:synchronize()
  pool:terminate()
  return pros
end

function M.Dataset(proteins,labels,meani,stdvi)
    local dataset = 
    dataset.data = proteins
    dataset.label = labels
    setmetatable(dataset,__index = function(t, i) 
                    return 
                        t.data[i],
                        t.label[i]
                     
                end
    );
    
    function dataset:size() 
        return self.data:size(1) 
    end
    
    local mean = torch.zeros(16)
    local stdv  = torch.zeros(16)

     if meani~=nil then
       for i=1,16 do
       dataset.data:select(3, i):add(-meani[i])
       dataset.data:select(3, i):div(stdvi[i])
       end
     else   
         for i=1,16 do
         mean[i] = dataset.data:select(3, i):mean() 
         dataset.data:select(3, i):add(-mean[i])
         stdv[i] = dataset.data:select(3, i):std()
         dataset.data:select(3, i):div(stdv[i])
         end
     end

    return dataset,mean,stdv
end

return M

【问题讨论】:

您将文件放入对您有意义的目录中。你想知道什么还不是很清楚。我们不知道这些文件的内容,那么我们如何帮助您确定将它们存储在哪里?请阅读How to Ask 你的意思是,你不确定你的代码是从哪里执行的?因此它似乎找不到您的Data 文件夹? 【参考方案1】:

乍一看,这是一个需要在 Lua 脚本中或在解释器中以交互方式使用的库。在任何一种情况下,解释器都应该从包含 Lua 项目的目录中启动。该目录还应该包含一个Data/ 子目录。 Data/ 目录应包含更多以癌症类型命名的目录,其中包含 CSV 文件。 例如:

path/to/lua/project/
└── Data
    ├── cancer1
    │   ├── protein1.csv
    │   └── protein2.csv
    └── cancer2
        ├── protein1.csv
        ├── protein2.csv
        └── protein3.csv

例如,您可以尝试:

cd path/to/lua/project
lua your_script.lua

除此之外,我真的不能对你的项目说太多。

我可能会澄清一些看起来很奇怪的线条——你说你不确定“路径”是如何工作的。在您显示的库代码中,require "paths" 在所示库的全局范围内运行名为 paths.lua 的文件中的代码。该文件可能与您的其余代码位于同一目录中,但可能位于 package.path 中列出的目录中的任何位置。

这个 (paths) 不是标准的 Lua 库,但看起来很简单。 paths.dir 似乎是一个函数,它返回一个包含目录内容作为字符串的表。连续两次调用table.remove 的奇怪行几乎可以肯定会获取这些目录内容并删除隐藏的... 文件(尽管可能值得注意的是它的效率非常低)。

【讨论】:

您好,感谢您的回复。上面的代码取自 github.com/tavanaei/Cancer-Suppressor-Gene-Deep-Learning 但是,作为文件的路径从未包含在 github 文件夹中。有没有办法复制文件?还是我在其余的 lua 文件中遗漏了什么? 嗨,我以前从未使用过 Torch,但看起来路径是 Torch 中的核心库 (github link)。 Torch (here) 的安装说明提到给定的命令将通过 LuaRocks(Lua 包管理器)安装路径库。听起来您安装了 Torch,但没有安装其他库。如果你安装了 LuaRocks,你可以使用命令luarocks install paths 安装路径。这是包裹页面:LuaRocks.

以上是关于在 Lua 中查看文件目录的主要内容,如果未能解决你的问题,请参考以下文章

lua5.2怎么使用require包含外部脚本文件

如何用 Lua 语言创建包含文件?

如何在vsvisualstudio调试环境下查看lua的调用栈,变量信息

LOVE2D-02-Hello World

如何在 Jitsi 韵律插件 lua 文件中添加日志

linux 查看第几周