web-dev-qa-db-fra.com

Importation de fichier texte: Aucune colonne à analyser à partir d'un fichier

J'essaie de prendre l'entrée de sys.stdin. Ceci est un programme de réduction de carte pour hadoop. Le fichier d'entrée est au format txt. Aperçu de l'ensemble de données: 

196 242 3   881250949
186 302 3   891717742
22  377 1   878887116
244 51  2   880606923
166 346 1   886397596
298 474 4   884182806
115 265 2   881171488
253 465 5   891628467
305 451 3   886324817
6   86  3   883603013
62  257 2   879372434
286 1014    5   879781125
200 222 5   876042340
210 40  3   891035994
224 29  3   888104457
303 785 3   879485318
122 387 5   879270459
194 274 2   879539794
291 1042    4   874834944

Code que j'ai essayé - 

import sys
df = pd.read_csv(sys.stdin,error_bad_lines=False)

J'ai aussi essayé avec delimiter = \t, header=False,defining column name Rien ne semble fonctionner, l'erreur que je reçois est la suivante:

[root@sandbox lab]# cat /root/lab/u.data | python /root/lab/mid-1-mapper.py |python /root/lab/mid-1-reducer.py
Traceback (most recent call last):
  File "/root/lab/mid-1-reducer.py", line 8, in <module>
    df = pd.read_csv(sys.stdin,delimiter='\t')
  File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 645, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 388, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 729, in __init__
    self._make_engine(self.engine)
  File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 922, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 1389, in __init__
    self._reader = _parser.TextReader(src, **kwds)
  File "pandas/parser.pyx", line 538, in pandas.parser.TextReader.__cinit__ (pandas/parser.c:5896)
pandas.io.common.EmptyDataError: No columns to parse from file

Cependant, si j'essaye cela directement en python (pas dans hadoop), cela fonctionne bien. 

J'ai essayé de regarder dans les posts stackoverflow, l'un des post suggéré d'essayer et sauf. L'application qui me laisse avec un fichier vide. Quelqu'un peut-il aider? Merci

5
mezz

Utiliser try and except vous permet de continuer malgré les erreurs et de les gérer. Cela ne corrigera pas vos erreurs comme par magie.

read_csv attend des fichiers csv, ce que votre saisie n'est évidemment pas. Un rapide coup d'oeil dans la documentation:

delim_whitespace: boolean, valeur par défaut False

Spécifie si les espaces (par exemple '' ou '') seront utilisés ou non. Équivalent à sep = '+ s'. Si cette option est définie sur True, rien ne doit être transmis pour le paramètre délimiteur.

Cela semble être le bon argument. Utilisation

pandas.read_csv(filepath_or_buffer, delim_whitespace=True).

Utiliser delimiter='\t' devrait également fonctionner, à moins que les onglets ne soient développés (remplacés par des espaces). Comme nous ne pouvons pas vraiment le savoir, delim_whitespace semble être la meilleure option. 

Si cela ne vous aide pas, imprimez simplement votre sys.stdin pour vérifier si vous transmettez correctement le texte.

Edit: Je viens de voir que vous utilisez 

cat /root/lab/u.data | python /root/lab/mid-1-mapper.py |python /root/lab/mid-1-reducer.py

Est-ce que cela est prévu pour que mid-1-reducer.py traite la sortie de mid-1-mapper.py. Si vous souhaitez traiter le contenu du fichier u.data, envisagez de lire le fichier et non pas sys.stdin.

4
DerWeh

Vous devez définir delim_whitespace sur True pour utiliser des espaces comme séparateur.

import sys
import pandas as pd

if __== '__main__':
    df = pd.read_csv(sys.stdin, header=None, delim_whitespace=True)
    print df
1
Grainier