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.
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
Vous devez vous connecter pour publier un commentaire.
Je sais que c'est super vieux, et je n'ai jamais compris ce qui se passe avec votre commentaire d'erreur (et de clarification du problème n'a pas le corriger pour moi, mais je pense qu'il a quelque chose à voir avec l'appel d'une classe plutôt que d'une fonction), mais plusieurs modifications fournir le résultat je pense que vous êtes la recherche pour.
Tout d'abord, si vous dites au lecteur il n'y a pas d'en-tête, il va interpréter toutes les lignes d'en-tête comme des données, de déterminer à la fois la forme et le type de données (par exemple, la chaîne de format pour les nombres). On peut en déduire qu'il y a un en-tête, pas de vis jusqu'à la forme, à laisser des commentaires comme une question distincte.
Nan provient de l'interprétation de la ligne de commentaires comme en-tête (qui elle est, mais également commenté), qui comporte quatre parties.
Vous pouvez vous débarrasser de la marque de commentaire sur l'en-tête en changeant la façon dont vous enregistrez le texte.
Cela élimine le problème avec le commentaire sur l'en-tête, mais ne permet pas d'en déduire la forme correcte, ou si vous avez de vrais commentaires vous aussi vous voulez ignorer.
Si vous voulez découvrir si il y a un en-tête, et aussi ignorer les lignes commentées, je ne peux que comprendre comment le faire que par l'appel d'une fonction.
OriginalL'auteur Andrew B