我怎样才能循环导入数据并按顺序保存

how can I make a loop for importing data and saving in sequence

我有一个 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" )

这是我手动操作的方式。我想避免手动操作

我没有要求澄清的评论权限,所以我会尽我所能回答这个问题,希望你能澄清我是否走错了方向。

根据您所写的内容,我假设您有一些专栏,'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')

您可以使用 str.format、Format String Syntax

构造文件名
>>> filename = '{}{:04}.pdb'
>>> filename.format('MN', 1)
'MN0001.pdb'
>>> filename.format('MN', 352)
'MN0352.pdb'
>>> 

您可以在遍历 sheet 的行时使用 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 的值后,您可以将其传递给任何 function/method - 类似于将 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))