【问题标题】:numpy loadtxt skip first rownumpy loadtxt 跳过第一行
【发布时间】:2013-06-13 14:59:39
【问题描述】:

当我尝试使用 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' 没有跳过标题,它跳过了第一行 cmets。我可以简单地确保 skiprows=3,但复杂的是我有大量文件,这些文件不一定在文件顶部都有相同数量的注释行。如何确保在使用 loadtxt 时只在这种情况下获取实际数据?

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

【问题讨论】:

  • 我还应该补充一点,我已经在 python 中尝试了各种解决方案来解析每一行以获取注释或字符,但很快意识到这种性质的任何东西都不可能起作用,因为 loadtxt 在非常开始。

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


【解决方案1】:

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

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)

【讨论】:

    【解决方案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=',')
    

    【讨论】:

      【解决方案3】:
      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 文件有注释行(以 # 开头)但没有标题行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-19
        • 2014-06-07
        • 2013-08-17
        • 2013-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多