numpy loadtxt 跳过第一行
Posted
技术标签:
【中文标题】numpy loadtxt 跳过第一行【英文标题】:numpy loadtxt skip first row 【发布时间】: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 在非常开始。 【参考方案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 文件有注释行(以 # 开头)但没有标题行。
【讨论】:
以上是关于numpy loadtxt 跳过第一行的主要内容,如果未能解决你的问题,请参考以下文章