在 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 中查看文件目录的主要内容,如果未能解决你的问题,请参考以下文章