2015-12-26 66 views
1

比方說,我在這個格式的文本文件:印刷線

***a 
foo bar 
lorem ipsum 
dolor 
---a 

我想打印我試圖用這個做***a---a之間的界限:

def printlines(): 
    pattern = open('text.txt').read().splitlines() 
    for line in pattern: 
     if line == "***a": 
      pass 
      while line != "---a": 
       print line 

     else: 
      pass 

但它在無限循環中打印***a。我該如何解決這個問題?

+1

它可以出現多少次? –

回答

1

如果你有多個實例可以啓動一個內部循環,當你打了起跑線上,這相當於你的同時,正在努力做的事情:

with open("test.txt") as f: 
    for line in f: 
     if line.rstrip() == "***a": 
      print("") 
      for line in f: 
       if line.rstrip() == "---a": 
        break 
       print(line.rstrip()) 

這爲:

***a 
foo bar 
lorem ipsum 
dolor 
---a 
***a 
bar bar 
foobar 
foob 
---a 

將輸出:

foo bar 
lorem ipsum 
dolor 

bar bar 
foobar 
foob 

如果你想有沒有換行線,我們可以map他們關閉,仍然迭代逐行:

with open("test.txt") as f: 
    # itertools.imap python2 
    f = map(str.rstrip, f) 
    for line in f: 
     if line == "***a": 
      print("") 
      for line in f: 
       if line == "---a": 
        break 
       print(line) 
+0

嘿@Padraic爲什麼我們不能簡單地把'if line!='**** a'或line!='----- a''並將剩下的行放入'list'中 –

+0

@NikhilParmar,因爲'「foo」!=「foo \ n」' ,因爲我們沒有拆分線,我們仍然保持換行符 –

+0

好的,謝謝:)得到它 –

2

使用breakcontinue

def printlines(): 
    pattern = open('text.txt').read().splitlines() 
    for line in pattern: 
     if line == "***a": 
      continue 
     if line == "---a": 
      break 
     print line 

break語句,像C,爆發最小的封閉 for或while循環。

繼續

continue語句是從C借來的,下 迭代循環的繼續。

+1

雖然這也會在'*** a' /'--- a'模式之外打印行。 – poke

+0

是的,它只對給定的例子有效,用來說明'break'和'continue'語句。 – klashxx

1

使用狀態機。這意味着,一旦你看到你的開放模式,設置一個狀態,所以你知道以下幾行現在與你有關。然後繼續找出來末端圖形將其關閉:

def printlines(): 
    # this is our state 
    isWithin = False 

    with open('text.txt') as f: 
     for line in f: 
      # Since the line contains the line breaking character, 
      # we have to remove that first 
      line = line.rstrip() 

      # check for the patterns to change the state 
      if line == "***a": 
       isWithin = True 
      elif line == "---a": 
       isWithin = False 

      # check whether we’re within our state 
      elif isWithin: 
       print line 

因爲我們只有一次我們在isWithin狀態打印,我們可以輕鬆地跳過***a/---a模式的任何部分伸出側。因此,處理的文件會正確打印出來HelloWorld,沒有別的:

Foo 
***a 
Hello 
---a 
Bar 
***a 
World 
---a 
Baz 

此外,您應該使用with語句來打開文件,並遍歷文件對象,而不是直接讀它,並呼籲splitlines() 。通過這種方式,您可以確保文件正確關閉,並且您只讀過一行又一行,從而提高了內存的使用效率。

+0

線將永遠不會等於如果''*** a「' –

+0

@PadraicCunningham感謝(不是很明顯)提醒;) – poke

+0

我以爲是;) –