1. ホーム
  2. python

[解決済み] テキストファイルのインポート:ファイルから解析される列がない

2022-02-17 05:50:13

質問

sys.stdinから入力を取得しようとしています。これはhadoopのためのmap reducerプログラムです。入力ファイルは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の投稿を調べようとしました、投稿の一つは、tryとexceptを提案しました。それを適用すると、空のファイルが残ります。 どなたか助けていただけませんか?ありがとうございます。

解決方法は?

try と except を使用すると、エラーが発生しても続行し、エラーに対処することができます。魔法のようにエラーを解決してくれるわけではありません。

read_csv 期待する csv ファイルであり、あなたの入力は明らかに違う。ドキュメントをざっと見てみると

delim_whitespace : boolean, デフォルト False

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.py の出力を処理します。 mid-1-mapper.py . ファイルの内容を処理したい場合 u.data は、ファイルを読むことを考慮し sys.stdin .