Python脚本未按要求工作
您好,我正在编写一个python脚本来生成web页面的每月和每日访问次数。输入文件: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
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
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)。