导入文本文件:无要从文件中解析的列

时间:2016-10-22 14:45:39

标签: python pandas hadoop-streaming

我正在尝试从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帖子,其中一个帖子建议尝试和除外。应用它会留下一个空文件。 有人可以帮忙吗?感谢

2 个答案:

答案 0 :(得分:6)

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

csv期待pandas.read_csv(filepath_or_buffer, delim_whitespace=True). 个文件,您的输入显然不是。快速浏览一下文档:

  

delim_whitespace:布尔值,默认为False

     

指定是否将空格(例如&#39;&#39;或#39;&#39;)用作sep。相当于设置sep =&#39; + s&#39;。如果此选项设置为True,则不应为delimiter参数传递任何内容。

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

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的内容,请考虑阅读该文件,而不是int

答案 1 :(得分:1)

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