2017-06-23 26 views
0

我想列出所有的.pdb文件和.ent文件並執行腳本並打印序列,但程序看起來程序運行不正常,並且沒有顯示任何結果。代碼是打開文件列表並執行腳本

import os 
    path="c:/pdb" 
    dirs=os.listdir(path) 
    for file in dirs: 
     list1=[] 
     for lines in file: 
      list=lines.split() 
      id=list[0] 
      if id=='ATOM' or id=='HETATM': 
       if list[4]=='A': 
        if list[2]=='C4': 
         list1.append(list[3]) 
     print("The sequence is:" ,list1) 
+0

可以摺疊那些3'if's成一個。另外,考慮一個與'id'不同的名稱,因爲它會隱藏內建的'id()'函數。 –

+0

我想檢查條件,所以我不能摺疊三個如果s。我改變了id到其他名字,但沒有工作。該代碼適用於一個文件,但不起作用,如果我打開目錄並將其自動化爲所有文件。 –

回答

0

os.listdir返回一個字符串列表[1],所以你不能對它們做「文件中的行」(這樣做,你只是迭代文件名字符串,而不是文件內容)。您可以使用os.walk()[2]這一點,如:

import os 
path = 'c:/pdb' 
for dirpath, dirnames, fnames in os.walk(path): 
    for fname in fnames: 
     if fname.endswith('txt'): 
      with open(os.path.join(dirpath, fname)) as fp: 
       for line in fp: 
        <program logic here> 

也切記不要用像「名單」或「身份證」保留字 - 檢查這些在這裏docs.python.org/3.3/參考/ lexical_analysis.html#關鍵字

[1] https://docs.python.org/3/library/os.html#os.listdir

[2] https://docs.python.org/3/library/os.html#os.walk

+0

謝謝這麼多! –

+0

@SushmitaPal考慮接受這個答案。點擊左側的勾號。 –

1

在windows上工作時,您可以嘗試使用轉義反斜槓指定您的路徑。

import os 
path = "c:\\pdb" 
for file in os.listdir(path): 
    list1 = [] 
    for lines in open(file): 
     list = lines.split() 
     idl = list[0] 
     if (idl == 'ATOM' or idl == 'HETATM') and list[4]=='A' and list[2]=='C4': 
      list1.append(list[3]) 

    print("The sequence is:", list1) 

此外,if已摺疊,但他們做同樣的事情。過深的縮進可能會妨礙可讀性。

+0

它沒有奏效。問題就在於這是一個空列表。該代碼適用於一個文件。 –

相關問題