2010-01-03 61 views
8

如何檢查Python中的EOF?我在代碼中發現了一個錯誤,其中分隔符後的最後一個文本塊沒有添加到返回列表中。或者,也許有更好的方式來表達這個功能?如何檢查Python中的EOF?

這裏是我的代碼:

def get_text_blocks(filename): 
    text_blocks = [] 
    text_block = StringIO.StringIO() 
    with open(filename, 'r') as f: 
     for line in f: 
      text_block.write(line) 
      print line 
      if line.startswith('-- -'): 
       text_blocks.append(text_block.getvalue()) 
       text_block.close() 
       text_block = StringIO.StringIO() 
    return text_blocks 
+0

現在嘗試,固定我的功能X2 =( – 2010-01-03 04:37:18

回答

3

您可能會發現更容易使用這個解決itertools.groupby

def get_text_blocks(filename): 
    import itertools 
    with open(filename,'r') as f: 
     groups = itertools.groupby(f, lambda line:line.startswith('-- -')) 
     return [''.join(lines) for is_separator, lines in groups if not is_separator] 

另一種替代方法是使用regular expression匹配隔板:

def get_text_blocks(filename): 
    import re 
    seperator = re.compile('^-- -.*', re.M) 
    with open(filename,'r') as f: 
     return re.split(seperator, f.read()) 
+0

有趣的答案馬克。我不知道itertools,謝謝。 – ajushi 2010-01-03 04:31:19

+0

+1對於RegEx版本,itertools版本有點神祕。 – 2010-01-03 04:40:00

+0

我在ineractive解釋器上嘗試了itertools版本,它返回一個空字符串。行似乎是一個itertools._grouper對象 – ajushi 2010-01-03 04:44:16

1

的檔案結尾條件只要for語句終止持有 - 似乎minorly解決這個代碼最簡單的方法(你可以在年底提取text_block.getvalue()如果你想在追加它之前檢查它不是空的)。

+0

感謝亞歷克斯我骯髒的解決方案是增加text_blocks 。.append(text_block.getvalue())及以下的塊text_block.close()它的工作原理,但它不是幹:/ – ajushi 2010-01-03 04:47:17

0

爲什麼你需要StringIO的嗎?

def get_text_blocks(filename): 
    text_blocks = [""] 
    with open(filename, 'r') as f: 
     for line in f: 
      if line.startswith('-- -'): 
       text_blocks.append(line) 
      else: text_blocks[-1] += line   
    return text_blocks 

編輯:修正了功能,其他建議可能會更好,只是想寫一個類似於原來的功能。

編輯:「 - - 」假定文件開頭,加入空字符串到列表中,你可以「修復」 IndexError或者你可以用這一個:

def get_text_blocks(filename): 
    text_blocks = [] 
    with open(filename, 'r') as f: 
     for line in f: 
      if line.startswith('-- -'): 
       text_blocks.append(line) 
      else: 
       if len(text_blocks) != 0: 
        text_blocks[-1] += line   
    return text_blocks 

但兩個版本看起來有點醜陋的我,reg-ex版本更加清潔。

+0

那還惦記着最後一塊 – 2010-01-03 03:59:54

+0

能否請您提供測試輸入數據 – 2010-01-03 04:04:40

+0

@maiku測試?輸入數據是phpMyAdmin的SQL轉儲,我需要分隔blo中的文本cks用一個以 - - ...開頭的行分開 – ajushi 2010-01-03 04:08:35

0

這是標準的問題與發射緩衝器。

你不檢測EOF - 這是不必要的。你寫最後的緩衝區。

def get_text_blocks(filename): 
    text_blocks = [] 
    text_block = StringIO.StringIO() 
    with open(filename, 'r') as f: 
     for line in f: 
      text_block.write(line) 
      print line 
      if line.startswith('-- -'): 
       text_blocks.append(text_block.getvalue()) 
       text_block.close() 
       text_block = StringIO.StringIO() 
     ### At this moment, you are at EOF 
     if len(text_block) > 0: 
      text_blocks.append(text_block.getvalue()) 
     ### Now your final block (if any) is appended. 
    return text_blocks 
1
def get_text_blocks(filename): 
    text_blocks = [] 
    text_block = StringIO.StringIO() 
    with open(filename, 'r') as f: 
     for line in f: 
      text_block.write(line) 
      print line 
      if line.startswith('-- -'): 
       text_blocks.append(text_block.getvalue()) 
       text_block.close() 
       text_block = StringIO.StringIO() 
     ### At this moment, you are at EOF 
     if len(text_block) > 0: 
      text_blocks.append(text_block.getvalue()) 
     ### Now your final block (if any) is appended. 
    return text_blocks 
-2

這是一個快速的方法,如果你有一個空文件:

if f.read(1) == '': 
print "EOF" 
f.close() 
+0

不,因爲''之間沒有空格。我用一個空格對文件進行了測試,但沒有檢測到文件是空的。 – AndroidDebaser 2013-04-23 18:46:53

+1

如果文件包含一個空格,它不是空的。 – Dave 2014-07-04 01:30:32