2013-04-09 67 views
1

我想加载一个json文件作为映射函数的一部分,但它返回“目录中没有这样的文件”,虽然该文件存在。MRJOB打开JSON文件 - Python

我已经打开一个文件并通过它的行解析。但是想要将它的一些值与第二个JSON文件进行比较。

from mrjob.job import MRJob 
import json 
import nltk 
import re  

WORD_RE = re.compile(r"\b[\w']+\b") 
sentimentfile = open('sentiment_word_list_stemmed.json') 

def mapper(self, _, line): 
    stemmer = nltk.PorterStemmer() 
    stems = json.loads(sentimentfile) 

    line = line.strip() 
    # each line is a json line 
    data = json.loads(line) 
    form = data.get('type', None) 

    if form == 'review': 
     bs_id = data.get('business_id', None) 
     text = data['text'] 
     stars = data['stars'] 

     words = WORD_RE.findall(text) 
     for word in words: 
     w = stemmer.stem(word) 
     senti = stems.get[w] 

     if senti: 
      yield (bs_id, (senti, 1)) 

回答

0

您正在使用json.loads()函数,同时传入打开的文件。改为使用json.load()(注意,不是s)。

stems = json.load(sentimentfile) 

你确实需要重新打开文件每次你打电话给你mapper()功能的时间,更好地只存储全球:

sentimentfile = 'sentiment_word_list_stemmed.json' 

def mapper(self, _, line): 
    stemmer = nltk.PorterStemmer() 
    stems = json.load(open(sentimentfile)) 

最后但并非最不重要的,你应该使用一个绝对路径的文件名,并不依赖于当前的工作目录是正确的。

4

根本不应该在映射函数中打开文件。您只需要将该文件作为STDIN传递或作为映射器的第一个参数来拾取它。像这样做:

python mrjob_program.py sentiment_word_list_stemmed.json > output 

OR

python mrjob_program.py <sentiment_word_list_stemmed.json> output 

要么一会工夫。它说没有这样的文件或目录,因为这些映射器无法看到你指定的文件。映射器被设计为在远程机器上运行。即使您想从映射器中的文件中读取数据,也需要将传递的文件复制到群集中的所有机器上,这对本示例来说没有任何意义。您实际上可以指定一个DEFAULT_INPUT_PROTOCOL,以便映射器知道您正在使用哪种类型的输入。

下面是关于这个问题的谈话,这将有助于:

http://blip.tv/pycon-us-videos-2009-2010-2011/pycon-2011-mrjob-distributed-computing-for-everyone-4898987/