Les Pandas lire csv sans en-tête (qui pourrait être là)

Je suis en train de lire un .csv fichier en morceaux (python-moteur) et ignorer l'en-tête (ou toutes les lignes commençant par un caractère de commentaire). Il n'est pas connu a priori si le fichier contient un en-tête ou pas, donc il n'est pas possible de simplement ignorer la première ligne, car il est peut-être déjà une ligne de données.

Réglage header=None n'résoudre le problème. Si j'invoque get_chunk et souhaitez les valeurs de ligne, j'ai toujours l'en-tête/ou de la ligne de commentaire.

De sortie souhaité serait tout de même comme numpy.loadtxt()

Le code ci-dessous montre ce qui se passe:

import numpy as np
from pandas.io.parsers import TextFileReader
fn = '/tmp/test.csv'
np.savetxt(fn, np.arange(300).reshape(100,3), header="makes no sense")
print np.loadtxt(fn).shape # output (100,3)

reader = TextFileReader(fn, chunksize=10, header=None)
reader.get_chunk().values

# output
array([['#', 'makes', 'no', 'sense'],
       ['0.000000000000000000e+00', '1.000000000000000000e+00',
        '2.000000000000000000e+00', None],
       ['3.000000000000000000e+00', '4.000000000000000000e+00',
        '5.000000000000000000e+00', None],
       ['6.000000000000000000e+00', '7.000000000000000000e+00',
        '8.000000000000000000e+00', None],
       ['9.000000000000000000e+00', '1.000000000000000000e+01',
        '1.100000000000000000e+01', None],
       ['1.200000000000000000e+01', '1.300000000000000000e+01',
        '1.400000000000000000e+01', None],
       ['1.500000000000000000e+01', '1.600000000000000000e+01',
        '1.700000000000000000e+01', None],
       ['1.800000000000000000e+01', '1.900000000000000000e+01',
        '2.000000000000000000e+01', None],
       ['2.100000000000000000e+01', '2.200000000000000000e+01',
        '2.300000000000000000e+01', None],
       ['2.400000000000000000e+01', '2.500000000000000000e+01',
        '2.600000000000000000e+01', None]], dtype=object)

Si je précise le commentaire char via

   reader = TextFileReader(fn, chunksize=10, header=None, comment='#')

J'obtiens une exception:

In [99]: reader = pandas.io.parsers.TextFileReader('/tmp/test.csv', chunksize=10, header=None, index_col=False, comment="#")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-99-64b1c0bce4ef> in <module>()
----> 1 reader = pandas.io.parsers.TextFileReader('/tmp/test.csv', chunksize=10, header=None, index_col=False, comment="#")
/home/marscher/anaconda/lib/python2.7/site-packages/pandas/io/parsers.pyc in __init__(self, f, engine, **kwds)
560             self.options['has_index_names'] = kwds['has_index_names']
561 
--> 562         self._make_engine(self.engine)
563 
564     def _get_options_with_defaults(self, engine):
/home/marscher/anaconda/lib/python2.7/site-packages/pandas/io/parsers.pyc in _make_engine(self, engine)
703             elif engine == 'python-fwf':
704                 klass = FixedWidthFieldParser
--> 705             self._engine = klass(self.f, **self.options)
706 
707     def _failover_to_python(self):
/home/marscher/anaconda/lib/python2.7/site-packages/pandas/io/parsers.pyc in __init__(self, f, **kwds)
1400         # Set self.data to something that can read lines.
1401         if hasattr(f, 'readline'):
-> 1402             self._make_reader(f)
1403         else:
1404             self.data = f
/home/marscher/anaconda/lib/python2.7/site-packages/pandas/io/parsers.pyc in _make_reader(self, f)
1505                 self.pos += 1
1506                 self.line_pos += 1
-> 1507                 sniffed = csv.Sniffer().sniff(line)
1508                 dia.delimiter = sniffed.delimiter
1509                 if self.encoding is not None:
/home/marscher/anaconda/lib/python2.7/csv.pyc in sniff(self, sample, delimiters)
180 
181         quotechar, doublequote, delimiter, skipinitialspace = \
--> 182                    self._guess_quote_and_delimiter(sample, delimiters)
183         if not delimiter:
184             delimiter, skipinitialspace = self._guess_delimiter(sample,
/home/marscher/anaconda/lib/python2.7/csv.pyc in _guess_quote_and_delimiter(self, data, delimiters)
221                       '(?:^|\n)(?P<quote>["\']).*?(?P=quote)(?:$|\n)'):                            #  ".*?" (no delim, no space)
222             regexp = re.compile(restr, re.DOTALL | re.MULTILINE)
--> 223             matches = regexp.findall(data)
224             if matches:
225                 break
TypeError: expected string or buffer

Modifier cette erreur est causée par pas d'emballage commentaire dans une liste.

Désolé, demandez-vous comment faire pour ignorer les lignes de commentaire? il y a un comment param pour read_csv, votre question n'est pas claire ce qui fait votre csv ressembler et qu'essayez-vous de résoudre?
le csv s'écrit avec numpy (l'exemple de code que j'ai donné) :
# ne fait pas de sens 0.000000000000000000 e+00 1.000000000000000000 e+00 2.000000000000000000 e+00 3.000000000000000000 e+00 4.000000000000000000 e+00 5.000000000000000000 e+00 6.000000000000000000 e+00 7.000000000000000000 e+00 8.000000000000000000 e+00
Eh bien cela a bien fonctionné pour moi: df = pd.read_csv(r'c:\data\np.txt', sep='\s+', header=None, comment='#')
si je passe le commentaire enveloppé dans une liste, je n'ai pas l'TypeError plus, mais le résultat n'est pas celle attendue.

OriginalL'auteur marscher | 2015-04-09