使用numpy过滤多个注释符号
我想找到一种方法,从一个包含多种注释符号的文件中提取数据。这个输入文件看起来像这样:
# filename: sample.txt
# Comment 1
# Comment 2
$ Comment 3
1,10
2,20
3,30
4,40
# Comment 4
我似乎只能用下面的代码去掉一种注释类型,但找不到任何文档说明我该如何去掉两种注释。
import numpy as np
data = np.loadtxt('sample.txt',comments="#") # I need to also filter out '$'
有没有其他方法可以实现这个目标呢?
6 个回答
0
我查看了numpy.loadtxt的代码,发现它不支持使用多个字符作为注释,因为它使用了str.split这个方法:https://github.com/numpy/numpy/blob/v1.8.1/numpy/lib/npyio.py#L790
我觉得你可以逐行读取文件,检查每一行是否包含注释,然后再把有效的行传给numpy.fromstring。
1
因为你的文件中的每一行要么是注释,要么是数据,所以我建议你在用numpy处理之前,先把文件读进来。可以用正则表达式把注释行去掉。
import re
from StringIO import StringIO
import numpy as np
with open('sample.txt', 'r') as f:
data = re.sub(r'\s*[#\$].*\n', '', f.read())
data = np.genfromtxt(StringIO(data), dtype=int, delimiter=',')
这样你就能得到想要的numpy数组 data
。需要注意的是,即使某一行(不小心)开头有空格,后面跟着注释符号,这种方法依然有效。
4
我会创建一个生成器,这个生成器会忽略掉注释部分,然后把它传递给 np.genfromtxt()
这个函数。
gen = (r for r in open('sample.txt') if not r[0] in ('$', '#'))
a = np.genfromtxt(gen, delimiter=',')
10
简单来说,可以用一个列表来存放评论,比如:
data = np.loadtxt('sample.txt',comments=['#', '$', '@'])
2
在这种情况下,你需要使用标准的Python循环来处理输入,比如可以这样写:
data = []
with open("input.txt") as fd:
for line in fd:
if line.startswith('#') or line.startswith('$'):
continue
data.append(map(int, line.strip().split(',')))
print data
输出结果:
[[1, 10], [2, 20], [3, 30], [4, 40]]