2015-05-12 185 views
0

我擁有一個文件,我想讀取它的特定部分。這是文件。如何從特定行讀取python中的特定行

..... ..... 管理服務器界面開始 ... .... .... .... .... 管理服務器接口結束 ... ....

我想讀'管理服務器接口開始'到'管理服務器接口結束'之間的文件部分。我在perl中找到了一種方法,但是在python中找不到方法。

在Perl

while (<INP>) 
{ 
    print $_ if(/^AdminServer interface definitions begins/ .. /^AdminServer interface definitions ends/); 
} 

可能anyonle請幫助。

回答

3

您可以逐行閱讀文件並收集標記之間的內容。

def dispatch(inputfile): 
    # if the separator lines must be included, set to True 
    need_separator = True 
    new = False 
    rec = [] 
    with open(inputfile) as f: 
     for line in f: 
      if "Admin server interface begins" in line: 
       new = True 
       if need_separator: 
        rec = [line] 
       else: 
        rec = [] 
      elif "Admin server interface ends" in line: 
       if need_separator: 
        rec.append(line) 
       new = False 
       # if you do not need to process further, uncomment the following line 
       #return ''.join(rec) 
      elif new: 
       rec.append(line) 
    return ''.join(rec) 

上面的代碼將成功返回數據,即使輸入文件不包含結束分隔符(Admin server interface ends)。您可以使用條件修改的最後return,如果你想趕上這樣的文件:

if new: 
    # handle the case where there is no end separator 
    print("Error in input file: no ending separator") 
    return '' 
else: 
    return ''.join(rec) 
+0

您可能希望'elif'部分的'Admin server interface ends'。 – Santiago

+0

@ user3267581:是的,我打字太快,謝謝。糾正。 – WoJ

+0

你也應該跳出'elif'管理服務器接口中的循環:'block',因爲OP不需要文件 – oxymor0n

1

如果文件不是很大,你不關心內存消耗,你可以寫這個簡單的解決方案:

from os.path import isfile 
def collect_admin_server_interface_info(filename): 
    """ Collects admin server interface information from specified file. """ 
    if isfile(filename): 
     contents = '' 
     with open(filename, 'r') as f: 
      contents = file.read() 
     beg_str = 'Admin server interface begins' 
     end_str = 'Admin server interface ends' 
     beg_index = contents.find(beg_str + len(beg_str)) 
     end_index = contents.find(end_str) 
     if beg_index == -1 or end_index == -1: 
      raise("Admin server interface not found.") 
     return contents[beg_index : end_index] 
    else: 
     raise("File doesn't exist.") 

此方法將嘗試返回包含管理員服務器接口信息的單個字符串。