使用csv.reader跳过空白行

时间:2014-11-13 16:39:46

标签: python python-2.7 csv

我需要在.txt文件中读取,找到标签所在的行,返回这些标签的列表(或其他可迭代的)以及下一行的索引。在这个特定的程序中,我第一次使用它来打开文件并返回标签(这是一致的)和下一行的索引,以便识别用np.genfromtxt打开的内容。后续用法仅用于确定索引。

有时,技术人员在输入测试参数时会输入额外的回车符,这会产生额外的空白行。当发生这种情况时,我得到一个空集而不是标签。在TFM中,似乎csv.reader将该空行视为EOF,但我不知道如何告诉它继续检查。

有没有办法让它做到这一点? 有没有更好的方法来实现我想要的目标?


def get_labels(filename):
    index = 0    
    with open(filename, 'rb') as f:    
        dialect = csv.Sniffer().sniff(f.read())        
        f.seek(0)        
        reader = csv.reader(f, dialect)
        for row in reader:
            if 'TimeStamp (s)' not in row:
                index += 1
            else:
                return row, index + 1

更新: 我正在试图找出条带功能,但我认为这很笨重而不是要走的路。这是我到目前为止所尝试的内容:

def strip(filename):
    with open(otherfile, 'wb') as o:    
        with open(filename, 'rb') as f:
            for line in f:
                if line == '\n':
                    continue
                else:
                    o.write(line)
    f.close()
    o.close()    
    return o    

1 个答案:

答案 0 :(得分:1)

解决问题的快捷方法是剥离空行的第二个功能。您可以使用itertools.ifilter来完成这项工作:

import itertools

def get_labels(filename):
    index = 0    
    with open(filename, 'rb') as f:
        sample = ''.join(x[0] for x in zip(itertools.ifilter(strip, f), range(4)))
        dialect = csv.Sniffer().sniff(sample)        
        f.seek(0)        
        reader = csv.reader(itertools.ifilter(strip, f), dialect)
        for row in reader:
            if 'TimeStamp (s)' not in row:
                index += 1
            else:
                return row, index + 1

您可以编写自己的条带函数,而不是使用过滤器:

def strip_lines(iterable, maxlines=None):
    for i, line in enumerate(iterable):
        if line.strip() and (maxlines is None or maxlines > i):
            yield line

def get_labels(filename):
    index = 0    
    with open(filename, 'rb') as f:
        dialect = csv.Sniffer().sniff(''.join(strip_lines(f, 4))
        f.seek(0)        
        reader = csv.reader(strip_lines(f), dialect)
        for row in reader:
            if 'TimeStamp (s)' not in row:
                index += 1
            else:
                return row, index + 1