我正在尝试将json文件作为映射器函数的一部分加载,但它返回“目录中没有这样的文件”,尽管该文件存在。
我已经打开一个文件并通过它的行解析了。但是想将它的一些值与第二个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 :(得分:4)
您根本不应该在mapper函数中打开文件。您只需要将文件作为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,以便映射器知道您正在使用哪种类型的输入。
以下是有关该主题的讨论:
答案 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))
最后但并非最不重要的是,您应该使用文件名的绝对路径,而不是依赖当前正确的工作目录。