Python脚本未按要求工作

Python脚本未按要求工作,python,if-statement,Python,If Statement,您好,我正在编写一个python脚本来生成web页面的每月和每日访问次数。输入文件: ArticleName Date Hour Count/Visit Aa 20130601 10000 1 Aa 20130601 10000 1 Ew 20130601 10000 1 H 20130601 10000 2 H 20130602 10000 1 R 20130601 20000 2 R

您好,我正在编写一个python脚本来生成web页面的每月和每日访问次数。输入文件:

ArticleName Date        Hour    Count/Visit
Aa   20130601    10000   1
Aa   20130601    10000   1
Ew   20130601    10000   1
H    20130601    10000   2
H    20130602    10000   1
R    20130601    20000   2
R    20130602    10000   1
Ra   20130601    0   1
Ra   20130601    10000   2
Ra   20130602    10000   1
Ram  20130601    0   2
Ram  20130601    10000   3
Ram  20130602    10000   4
Re   20130601    20000   1
Re   20130602    10000   3
Rz   20130602    10000   1
我需要统计每个页面的每月和每日总页面浏览量

输出:

ArticleName Date     DailyView MonthlyView
Aa   20130601 2 2
Ew   20130601 1 1
H    20130601 2 2
H    20130602 1 3
R    20130601 2 2
R    20130602 1 4
Ra   20130601 5 5
Ra   20130602 1 6
Ram  20130601 5 5
Ram  20130602 4 9
Re   20130601 1 1
Re   20130602 3 4
Rz   20130602 1 1
我的剧本:

#!/usr/bin/python

import sys

last_date = 20130601
last_hour = 0
last_count = 0
last_article = None
monthly_count = 0
daily_count = 0

for line in sys.stdin:
  article, date, hour, count = line.split()
  count = int(count)
  date = int(date)
  hour = int(hour)

  #Articles match and date match
  if last_article == article and last_date == date:
      daily_count = count+last_count
      monthly_count = count+last_count
      # print '%s\t%s\t%s\t%s' % (article, date, daily_count, monthly_count)
  #Article match but date doesn't match 
  if last_article == article and last_date != date:
          monthly_count = count
          daily_count=count
          print '%s\t%s\t%s\t%s' % (article, date, daily_count, monthly_count)


  #Article doesn't match
  if last_article != article:
          last_article = article
          last_count = count
          monthly_count = count
          daily_count=count
          last_date = date
          print '%s\t%s\t%s\t%s' % (article, date, daily_count, monthly_count)
我能够获得大部分输出,但我的输出有两种情况是错误的: 1.如果ArticleName和ArticleDate相同,则无法获得对ArticleName进行汇总的方法。 对于eg,该脚本给出了行Ra的输出: Ra 20130601 1 Ra 20130601 3 Ra 20130602 1 因此,在最后,Ra应打印1+3+1=5作为最终月度总计数,而不是1

  • 由于我在第三个if条件中显示了所有与上一篇文章不相等的文章,因此我两次获得了具有相同文章名称和日期的文章的值。例如:
    Ra 20130601 1 1
    不应打印。 有人知道怎么纠正吗? 如果你需要更多的信息,请告诉我
    最简单的方法是建立一个以页面名称为键和值的双字典,即从日期到视图数的字典,迭代列表并生成字典,然后迭代每个页面的字典并计算每个月的页面数。

    尝试以下操作:

    import itertools
    import operator
    import sys
    
    lines = (line.split() for line in sys.stdin)
    prev_name, prev_month = '', '99999999'
    month_view = 0
    for (name,date), grp in itertools.groupby(lines, key=operator.itemgetter(0,1)):
        view = sum(int(row[-1]) for row in grp)
        if prev_name == name and date.startswith(prev_month):
            month_view += view
        else:
            prev_name = name
            prev_month = date[:6]
            month_view = view
        print '{}\t{}\t{}\t{}'.format(name, date, view, month_view)
    
    使用

    输出不同:

    Aa      20130601        2       2
    Ew      20130601        1       1
    H       20130601        2       2
    H       20130602        1       3
    R       20130601        2       2
    R       20130602        1       3
    Ra      20130601        3       3
    Ra      20130602        1       4
    Ram     20130601        5       5
    Ram     20130602        4       9
    Re      20130601        1       1
    Re      20130602        3       4
    Rz      20130602        1       1
    

    实现所需功能的更好方法是使用itertools中的map-reduce函数:

    导入itertools
    从itertools导入groupby
    从itertools导入dropwhile
    导入系统
    导入日期时间
    #将在一行中找到的单词列表转换为
    #由名称、日期/时间和访问次数组成的元组
    def get_记录(w):
    name=w[0]
    date=datetime.datetime.StrTime((w[1]+(“%0*d%”(6,int(w[2])),%Y%m%d%H%m%S))
    访问次数=整数(w[3])
    返回(姓名、日期、访问次数)
    #获取表示单个记录的元组并返回元组
    #由名称、年份和月份组成,记录将
    #分组。
    def按月份(姓名、日期、访问次数)获取密钥:
    报税表(姓名、日期、年份、日期、月份)
    #获取表示单个记录的元组并返回元组
    #由名称、年份、月份和日期组成,记录将
    #分组。
    def按天获取密钥((姓名、日期、访问)):
    报税表(姓名、日期、年份、日期、月份、日期、日期)
    #获取一个包含行的列表,每行包含
    #单词列表,跳过第一行
    words=(sys.stdin中的行的line.split())
    
    words=dropwhile(λx:x[0]所有数据都是2013年6月的,但所有文章都不同。我需要找出每篇文章每天和每月访问的时间。我得到了。它们是累积计数?对吗?
    R 20130602 1 4
    应该是
    R 20130602 1 3
    ?使用lambda表达式并将调用移动到groupby()可以缩短此代码直接在for循环中。为了清晰和易于调试,我更喜欢一步一步地进行操作。通过创建一个跳过标题行的迭代器改进了代码,而不是创建一个列表并弹出第一个元素,从而将整个数据存储在内存中。感谢@falsetru。理解这段代码在pyt中的作用时遇到问题hon:itertools.groupby(line,key=operator.itemgetter(0,2)):view=sum(int(row[-1]),对于grp中的row,我可以理解,我从lines中得到两个值name和date,这两个值是一行中的第一个和第三个值,其余的行是grp。我说得对吗?在第二行视图中,也是在[-1]时求和的行的grp中的行?如果是-1行表示什么,该行是否从grp中的-1开始Python@CtrlV,
    xs[-1]
    检索
    xs
    @CtrlV的最后一个值,我使用了
    groupby(lines,key=operator.itemgetter(0,1))
    而不是
    0,2
    :它根据第一个和第二个字段对行进行分组。(ArticleName,Date)。