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