NumPy loadtxt 跳过第一行

18

当我使用numpy的loadtxt函数尝试从CSV文件中导入数据时,遇到了一个小问题。以下是我所拥有的数据文件类型的示例。

假设它的名字是"datafile1.csv":

# Comment 1
# Comment 2
x,y,z 
1,2,3
4,5,6
7,8,9
...
...
# End of File Comment

我认为适用于这种情况的脚本应该是:

import numpy as np
FH = np.loadtxt('datafile1.csv',comments='#',delimiter=',',skiprows=1)

但是,我遇到了一个错误:

ValueError: could not convert string to float: x

这告诉我kwarg 'skiprows'没有跳过标题,而是跳过了第一行注释。我可以简单地确保skiprows=3,但问题是我有非常多的文件,并不一定都在文件顶部具有相同数量的注释行。在这种情况下,我该如何确保使用loadtxt只获取实际数据?

P.S. - 我也可以接受bash解决方案。


我还应该补充一点,我已经尝试了各种Python解决方案来解析每一行的注释或字符,但很快意识到这种方法根本行不通,因为loadtxt在最开始就失败了。 - astromax
3个回答

33

使用生成器表达式手动跳过注释行:

import numpy as np

with open('datafile1.csv') as f:
    lines = (line for line in f if not line.startswith('#'))
    FH = np.loadtxt(lines, delimiter=',', skiprows=1)

3
创建自己的自定义过滤器函数,例如:
def skipper(fname):
    with open(fname) as fin:
        no_comments = (line for line in fin if not line.lstrip().startswith('#'))
        next(no_comments, None) # skip header
        for row in no_comments:
            yield row

a = np.loadtxt(skipper('your_file'), delimiter=',')

1
def skipper(fname, header=False):
    with open(fname) as fin:
        no_comments = (line for line in fin if not line.lstrip().startswith('#'))
        if header:
            next(no_comments, None) # skip header
        for row in no_comments:
            yield row

a = np.loadtxt(skipper('your_file'), delimiter=',')

这只是对@Jon Clements答案的小修改,增加了一个可选参数"header",因为在某些情况下,csv文件有注释行(以#开头),但没有标题行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接