我需要在.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
答案 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