<blockquote><p>To be ultra clear (since I want to code this), you are suggesting that<br>
'first_commented_line' be a *new* accepted value for the kwarg 'names', to invoke the behaviour you suggest?<br>
</p>
</blockquote>
<p></p>
<p>Nope, I was just referring to some hypothetical variable name. I meant that:</p>
<p>first_values = None<br>
try:<br>
    while not first_values:<br>
        first_line = fhd.next()<br>
        if names is True:<br>
            parsed = [m for m in first_line.split(comments) if m.strip()]<br>
            if parsed:<br>
                first_value = split_line(parsed[0])<br>
        else:<br>
            ...</p>
<p>(it's not tested, I'm writing it as it comes. And I didn't even use the `first_commented_line` name, sorry)<br></p>
<blockquote><p>If this IS what you mean, I'd counter-propose something in the same spirit, but a bit simpler…we let the kwarg 'skip_header' take some additional value, say int(0), int(-1), str('auto'), or True.<br>

</p>
</blockquote>
<p><br>
</p>
<blockquote><p>In this case, instead of skipping a fixed number of lines, it will skip any number of consecutive empty OR commented lines;<br>
</p>
</blockquote>
<p><br>
I really like the idea of having `skip_header=-1` skip all the empty or commented lines (that is, lines whose first non-space character is the `comments` character). That'd be rather convenient.</p>
<p> <br>
</p>
<blockquote><p>The semantics of this are more intuitive, because this is what I am<br>
really after: to *skip* a commented *header* of arbitrary length. So my four examples below could be parsed with:</p>
<p>1. genfromtxt(..., names=True)<br>
2. genfromtxt(..., names=True, skip_header=True)<br>
3. genfromtxt(..., names=True)<br>
4. genfromtxt(..., names=True, skip_header=True)</p>
<p>…crucially #1 avoids the regression.<br></p>
<p>Does this seem good to everyone?<br>
</p>
</blockquote>
<p><br>
Sounds good w/ `skip_header=-1`<br></p>
<blockquote><p>But if this is NOT what you mean, then what you say does not actually work with the simple use-case of my Example #2 below. The first commented line is "# here is a..." with # as the first non-space character, so the part after becomes the names 'here', 'is', 'a' etc.<br>

</p>
</blockquote>
<p><br>
In that case, you could always use `skip_header=2`</p>
<blockquote><p>In short, the code can't resolve the ambiguity without some extra<br>
information from the user.<br>
</p>
</blockquote>
<p><br>
It's always best not to let the code guess too much anyway...</p>
<p>Well, no regression, and you have a nice plan. I'm for it.<br>
Anybody else?<br>
</p>