web-dev-qa-db-ja.com

テキストファイルのインポート:ファイルから解析する列はありません

Sys.stdinから入力を取得しようとしています。これは、hadoop用のマップレデューサープログラムです。入力ファイルはtxt形式です。データセットのプレビュー:

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

私が試しているコード-

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

私もdelimiter = \t, header=False,defining column name何も動作しないようです。私が得ているエラーはこのエラーです:

[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

ただし、Python(hadoopではなく)でこれを直接試してみると、問題なく動作します。

私はstackoverflowの投稿を調べようとしましたが、投稿の1つはtryとexceptを提案しました。適用すると、空のファイルが残ります。誰でも助けることができますか?ありがとう

8
mezz

Try and exceptを使用すると、エラーが発生しても処理を続行できます。エラーを魔法のように修正することはありません。

read_csvにはcsvファイルが必要ですが、入力は明らかにそうではありません。ドキュメントの概要:

delim_whitespace:ブール値、デフォルトはFalse

空白(例: ''または '')をsepとして使用するかどうかを指定します。 sep = '+ s'の設定と同等です。このオプションがTrueに設定されている場合、delimiterパラメーターには何も渡されません。

これは正しい議論のようです。つかいます

pandas.read_csv(filepath_or_buffer, delim_whitespace=True).

タブが展開される(スペースに置き換えられる)場合を除き、delimiter='\t'の使用も機能するはずです。わかりませんが、delim_whitespaceの方が適しているようです。

これで解決しない場合は、sys.stdinを印刷して、テキストが適切に渡されたかどうかを確認してください。

編集:あなたが使用しているのを見ました

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

これは、mid-1-reducer.pymid-1-mapper.pyの出力を処理するための方法です。ファイルの内容を処理する場合は、u.dataではなく、sys.stdinではなくファイルの読み取りを検討してください。

7
DerWeh

区切り文字として空白を使用するには、delim_whitespaceをTrueに設定する必要があります。

import sys
import pandas as pd

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