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

09-18 13:49