2016-11-28 30 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

相關問題