我怎样才能使一个循环导入数据和序列
问题描述:
节省我有一个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")
这是如何,如果我手动。我想避免手动做
答
你可以使用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))
答
我没有评论权限要求澄清,所以我要回答这个最好的我可以,并希望你可以澄清,如果我走错了方向。
从你写的内容来看,我假设你有一列'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
@nik - 现在看到编辑。 - 您可能想花时间在文档中通过[The Tutorial](https://docs.python.org/3/tutorial/controlflow.html)进行操作并练习示例? – wwii
@尼克,也许是在最后一行失踪paren ??,抱歉,但应该是obvioius。 – wwii
@nik您应该阅读我提供的链接中的格式字符串语法,并使用它直到您熟悉它的工作原理。你可以通过str.format任何你想要的,你不必通过它的个人cel值 - 看到我的第一个例子的答案。你也可以用''''+'''运算符 - ''''foo'+ str(004)+'.pdb''''构造简单的字符串,但str.format更加灵活,特别是当你有一个不确定前导零(或任何其他字符)的数量。 – wwii