numpy loadtxt跳过第一行

时间:2013-06-17 15:25:56

标签: python bash csv numpy import-from-csv

当我尝试使用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解决方案持开放态度。

3 个答案:

答案 0 :(得分:20)

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

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)

答案 1 :(得分:1)

创建自己的自定义过滤器功能,例如:

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=',')

答案 2 :(得分:0)

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文件具有注释行(以#开头),但没有标题行。 / p>