2016-11-28 43 views
1

节省我有一个xls文件和第一列例如我怎样才能使一个循环导入数据和序列

MN 
TN 
RMON 
BNE 
RMGS 
HUDGD 
YINT 

由许多行。然后我想通过每个单元(它的价值)的功能

mystruc1 = make_structure("MN") 
mystruc2 = make_structure("TN") 
mystruc3 = make_structure("RMON") 
mystruc4 = make_structure("BNE") 
mystruc5 = make_structure("RMGS") 
mystruc6 = make_structure("HUDGD") 
mystruc7 = make_structure("YINT") 

所以每次一个单元格的值会去功能

然后我想它的输出传递到另一个功能

out = Bio.PDB.PDBIO() 
out.set_structure(mystruc1) 
out.save("MN001.pdb") 
out.set_structure(mystruc2) 
out.save("MN002.pdb") 
out.set_structure(mystruc3) 
out.save("MN003.pdb") 
out.set_structure(mystruc4) 
out.save("MN004.pdb") 
out.set_structure(mystruc5) 
out.save("MN005.pdb") 
out.set_structure(mystruc6) 
out.save("MN006.pdb") 
out.set_structure(mystruc7) 
out.save("MN007.pdb") 

这是如何,如果我手动。我想避免手动做

回答

2

你可以使用str.format构建文件名,Format String Syntax

>>> filename = '{}{:04}.pdb' 
>>> filename.format('MN', 1) 
'MN0001.pdb' 
>>> filename.format('MN', 352) 
'MN0352.pdb' 
>>> 

您可以使用enumerate,同时遍历表单的行以帮助构造文件名。

import xlrd 
filename = '{}{:04}.pdb' 
workbook = xlrd.open_workbook('test.xls') 
for sheet in workbook.sheets(): 
    for n, row in enumerate(sheet.get_rows()): 
     col_0 = row[0].value 
     print filename.format(col_0, n) 

如果你只想迭代的第一列。

for sheet in workbook.sheets(): 
    for n, value in enumerate(sheet.col_values(0, start_rowx=0, end_rowx=None)): 
     print filename.format(value, n) 

或者你也可以直接访问CEL值。

for sheet in workbook.sheets(): 
    for i in xrange(sheet.nrows): 
     rowi_col0 = sheet.cell_value(i, 0) 
     print filename.format(rowi_col0, i) 

一旦你已经提取的CEL的值,你可以把它传递给任何函数/方法 - 类似于CEL值传递给str.format方法。

mystruc = make_structure(value) 

要自动处理cel值,请将您的进程添加到循环中。

for sheet in workbook.sheets(): 
    for i in xrange(sheet.nrows): 
     rowi_col0 = sheet.cell_value(i, 0) 
     #print filename.format(col_0, i) 
     my_structure = make_structure(rowi_col0) 
     out = Bio.PDB.PDBIO() 
     out.set_structure(my_structure) 
     out.save(filename.format(rowi_col0, i)) 
+0

@nik - 现在看到编辑。 - 您可能想花时间在文档中通过[The Tutorial](https://docs.python.org/3/tutorial/controlflow.html)进行操作并练习示例? – wwii

+0

@尼克,也许是在最后一行失踪paren ??,抱歉,但应该是obvioius。 – wwii

+0

@nik您应该阅读我提供的链接中的格式字符串语法,并使用它直到您熟悉它的工作原理。你可以通过str.format任何你想要的,你不必通过它的个人cel值 - 看到我的第一个例子的答案。你也可以用''''+'''运算符 - ''''foo'+ str(004)+'.pdb''''构造简单的字符串,但str.format更加灵活,特别是当你有一个不确定前导零(或任何其他字符)的数量。 – wwii

0

我没有评论权限要求澄清,所以我要回答这个最好的我可以,并希望你可以澄清,如果我走错了方向。

从你写的内容来看,我假设你有一列'MN',并且你想命名从'MN001.pdb'开始到'MN0xx.pdb'(其中xx在最后一排,你正在使用。

就可以实现这个

一种方式是通过与具有一个计数器和迭代与你的第二个for循环的每个迭代循环工作。

colname = "MN" 

for sheet in workbook.sheets(): 
    counter = 0 
    for row in range(sheet.nrows): 
     # pass your code here 
     counter += 1 
     s_counter = str(counter) 
     s = '' 
     if len(s_counter) < 2: 
      s = '0' + s 
     elif len(s_counter) < 3: 
      s = '00' + s 
     ... 
     out.save(s + '.pdb') 
+0

是否要传递单元格索引(如在Excel中格式化)或传递单元格的值?我不确定你在问什么。通过输出,你是指细胞的价值? – thleo