为什么python不会将stdin输入作为字典读取?



我知道我在这里做了一些愚蠢的事情,但是这就是。我正在为我的Udacity课程"介绍Map Reduce和Hadoop"做作业。我们的任务是制作一个映射器/减速器,它将在我们的数据集(论坛帖子的主体)中计算单词的出现次数。我已经知道如何做到这一点,但我无法让Python将stdin数据作为字典读取到reducer中。

以下是我到目前为止的方法:Mapper读取数据(在本例中是代码),并为每个论坛帖子生成word:count字典:
#!/usr/bin/python
import sys
import csv
import re
from collections import Counter

def mapper():
    reader = csv.reader(sys.stdin, delimiter='t')
    writer = csv.writer(sys.stdout, delimiter='t', quotechar='"', quoting=csv.QUOTE_ALL)
    for line in reader:
        body = line[4]
        #Counter(body)
        words = re.findall(r'w+', body.lower())
        c = Counter(words)
        #print c.items()
        print dict(c)


test_text = """""t""t""t""t"This is one sentence sentence"t""
""t""t""t""t"Also one sentence!"t""
""t""t""t""t"Hey!nTwo sentences!"t""
""t""t""t""t"One. Two! Three?"t""
""t""t""t""t"One Period. Two Sentences"t""
""t""t""t""t"Threenlines, one sentencen"t""
"""
# This function allows you to test the mapper with the provided test string
def main():
    import StringIO
    sys.stdin = StringIO.StringIO(test_text)
    mapper()
    sys.stdin = sys.__stdin__
if __name__ == "__main__":
    main()

论坛帖子的计数,然后去stdout如下:{'this': 1, 'is': 1, 'one': 1, 'sentence': 2}

则reducer应该将此stdin作为字典读取

#!/usr/bin/python
import sys
from collections import Counter, defaultdict
for line in sys.stdin.readlines():
    print dict(line)

但是失败了,给我这个错误信息:ValueError: dictionary update sequence element #0 has length 1; 2 is required

这意味着(如果我理解正确的话)它在每行中读取的不是字典,而是文本字符串。我怎样才能让python理解输入行是一个字典?我尝试过使用Counter和defaultdict,但仍然有同样的问题,或者在每个字符中读取它作为列表的元素,这也不是我想要的。

理想情况下,我希望映射器读取每行的字典,然后添加下一行的值,因此在第二行之后,值是{'this':1,'is':1,'one':2,'sentence':3,'also':1}等等......

谢谢,小

感谢@keyser, ast.literal_eval()方法对我有效。下面是我现在的代码:

#!/usr/bin/python
import sys
from collections import Counter, defaultdict
import ast
lineDict = {}
c = Counter()
for line in sys.stdin.readlines():
    lineDict = ast.literal_eval(line)
    c.update(lineDict)
print c.most_common()

相关内容

  • 没有找到相关文章

最新更新