2016-10-22 66 views
4

我想从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 似乎没有任何工作,我得到的错误是这样的错误:

[[email protected] 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帖子,其中一个帖子建议尝试和除了。应用使我留下一个空文件。 任何人都可以帮忙吗?谢谢

回答

3

使用try和except只是让你继续尽管错误和处理它们。它不会奇迹般地修复你的错误。

read_csv预计csv文件,您的输入显然不是。快速浏览文档:

delim_whitespace : boolean, default False

Specifies whether or not whitespace (e.g. ' ' or ' ') will be used as the sep. Equivalent to setting sep='+s'. If this option is set to True, nothing should be passed in for the delimiter parameter.

这似乎是正确的论点。使用

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

+0

进口SYS 进口熊猫作为PD 如果__name__ == '__main__': DF = pd.read_csv(sys.stdin,标题=无,delim_whitespace =真) 打印DF – mezz

+0

仍然得到同样的错误。 – mezz

+0

你可以从你的python脚本中打印出你的'sys.stdin'('mid-1-reducer.py'是否是重要的)?你可以简单地使用'readlines'函数或类似的东西。它是否提供与您在问题中输入的输入相同的输出? – DerWeh

0

您必须将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