如何在命令行上运行python程序之前将数据与python代码集成

时间:2017-07-18 11:35:23

标签: python python-3.x mapreduce pycharm mrjob

我从该超链接ml-100k.zip下载了movielens数据集(它是一个电影和用户信息数据集,它位于较旧的数据集选项卡中) 我已经编写了如下的简单MapReduce代码;

from mrjob.job import MrJob

class MoviesByUserCounter(MRJob):
    def mapper(self , key ,line):
        (userID,movieID,rating,timestamp)=line.split('\t')
        yield userID,movieID

    def reducer(self , user , movies):
        numMovies=0
        for movie in movies:
            numMovies=numMovies+1

         yield user,numMovies

if __name__=='__main__':
    MoviesByUserCounter.run()

我使用python 3.5.3版本和PyCharm社区版作为python ide。

我试过命令行

python my_code.py 

但它不起作用,因为我预期实际上它可以工作,但无论如何它等待不响应。它已经运行了一段时间实际上它仍在继续。它只在命令行上写道:

Running step 1 of 1...
reading from STDIN

我怎样才能在命令行的python程序代码中成功提供数据(u.data:它是ml-100k.zip中的数据文件)?如果还有其他解决方案,它也会很棒

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果我没有弄错,你想把你的数据作为命令行参数。

您希望使用sys.argv执行此操作。除此之外,请查看CLI(命令行界面)库。

示例:

import sys

def main(arg1, arg2, *kwargs)
    #do something
if __name__ == "__main__":
    #there are not enough args
    if len(sys.argv) < 3:
        raise SyntaxError("Too few arguments.")
    if len(sys.argv) != 3:
        # There are keyword arguments
        main(sys.argv[1], sys.argv[2], *sys.argv[3:])
    else:
        # no keyword args.
        main(sys.argv[1], sys.argv[2])

通过这种方式,您可以传递与位置相关的参数,例如普通的python位置参数,前两个参数和a=1形式的关键字参数。

使用示例:

将数据文件作为第一个参数传递,将参数作为第二个参数传递

python my_code.py data.zip 0.1 

如果您将使用多个命令行参数,则需要花时间使用CLI库,以使它们不再依赖于位置。