17

当我尝试使用 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 时,我只在这种情况下获取实际数据?

PS - 我也愿意接受 bash 解决方案。

4

3 回答 3

29

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

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)
于 2013-06-17T15:31:58.973 回答
2

创建自己的自定义过滤函数,例如:

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=',')
于 2013-06-17T15:46:26.223 回答
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=',')

这只是通过添加可选参数“header”对@Jon Clements 的答案的一点修改,因为在某些情况下,csv 文件具有注释行(以 # 开头)但没有标题行。

于 2019-01-23T07:51:28.443 回答