2010-01-03 62 views
8

Làm cách nào để kiểm tra EOF bằng Python? Tôi tìm thấy một lỗi trong mã của tôi, nơi khối văn bản cuối cùng sau khi dấu phân cách không được thêm vào danh sách trả về. Hoặc có thể có một cách tốt hơn để thể hiện chức năng này?Làm cách nào để kiểm tra EOF bằng Python?

Dưới đây là mã của tôi:

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

Cố gắng bây giờ, cố định chức năng x2 của tôi = ( –

Trả lời

3

Bạn có thể thấy việc giải quyết vấn đề này dễ dàng hơn bằng cách sử dụng 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] 

Một lựa chọn khác là sử dụng một regular expression để phù hợp với dải phân cách:

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

Câu trả lời thú vị Đánh dấu. Tôi không biết về itertools, cảm ơn. – ajushi

+0

+1 Đối với phiên bản RegEx, phiên bản itertools hơi khó hiểu. –

+0

Tôi đã thử phiên bản itertools trên trình thông dịch không hoạt động và nó trả về một chuỗi rỗng. các dòng có vẻ là đối tượng itertools._grouper – ajushi

1

Các end-of-file điều kiện tổ chức ngay sau khi tuyên bố for chấm dứt - mà dường như cách đơn giản nhất để minorly sửa mã này (bạn có thể trích xuất text_block.getvalue() ở cuối nếu bạn muốn kiểm tra nó không có sản phẩm nào trước khi thêm nó).

+0

Cảm ơn Alex giải pháp bẩn của tôi là thêm text_blocks .append (text_block.getvalue()) và text_block.close() bên dưới khối. Nó hoạt động nhưng nó không phải DRY:/ – ajushi

0

Tại sao bạn cần StringIO ở đây?

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 

EDIT: Cố định chức năng, các đề xuất khác có thể tốt hơn, chỉ muốn viết chức năng tương tự như chức năng gốc.

EDIT: Giả tập tin bắt đầu với "- -", bằng cách thêm chuỗi rỗng vào danh sách bạn có thể "sửa chữa" các IndexError hoặc bạn có thể sử dụng cái này:

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 

Nhưng cả hai phiên bản tìm kiếm một bit xấu xí với tôi, phiên bản reg-ex sạch hơn nhiều.

+0

Điều đó vẫn còn nhớ khối cuối cùng –

+0

Bạn có thể vui lòng cung cấp dữ liệu đầu vào thử nghiệm không? –

+0

@maiku bài kiểm tra dữ liệu đầu vào là một SQL dump bởi phpMyAdmin.Tôi cần phải tách văn bản trong blo cks phân cách bởi một dòng bắt đầu với - ... – ajushi

0

Đây là vấn đề tiêu chuẩn với phát bộ đệm.

Bạn không phát hiện EOF - điều đó là không cần thiết. Bạn viết bộ đệm cuối cùng.

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

Đây là một cách nhanh chóng để xem nếu bạn có một tập tin rỗng:

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

Không, bởi vì không có dấu cách giữa ''. Tôi đã thử nghiệm điều này trên một tệp chỉ với một không gian và không phát hiện tệp đó trống. – AndroidDebaser

+1

Nếu tệp chứa không gian thì nó không trống. – Dave

Các vấn đề liên quan