基于Python CSV行值的流控制

基于Python CSV行值的流控制,python,csv,control-flow,urlparse,Python,Csv,Control Flow,Urlparse,我正在使用具有以下结构的CSV: "2012-09-01 20:03:15","http://example.com" 这些数据是我浏览历史记录的清理转储。我对每天计算前五个独特的域名感兴趣。以下是我到目前为止的情况: from urlparse import urlparse import csv from collections import Counter domains = Counter() with open("history.csv") as f: for row i

我正在使用具有以下结构的CSV:

"2012-09-01 20:03:15","http://example.com"
这些数据是我浏览历史记录的清理转储。我对每天计算前五个独特的域名感兴趣。以下是我到目前为止的情况:

from urlparse import urlparse
import csv
from collections import Counter

domains = Counter()

with open("history.csv") as f:
    for row in csv.reader(f):
        d = row[0]
        dt = d[11:19]
        dt = dt.replace(":","")
        dd = d[0:10]
        if (dt < "090000") and (dt > "060000"):
            url = row[1]
            p = urlparse(url)
            ph = p.hostname
            print dd + "," + dt + "," + ph
            domains += Counter([ph])
t = str(domains.most_common(20))
从urlparse导入urlparse
导入csv
从收款进口柜台
域=计数器()
打开(“history.csv”)作为f:
对于csv.reader(f)中的行:
d=第[0]行
dt=d[11:19]
dt=dt。替换(“:”,“”)
dd=d[0:10]
如果(dt<“090000”)和(dt>“060000”):
url=行[1]
p=url解析(url)
ph=p
打印dd+“,”+dt+“,”+ph
域+=计数器([ph])
t=str(域。最常见(20))
使用d、dt和dd,我将日期和时间分开。对于上述示例行,dt=20:03:15,dd=2012-09-01。“如果(dt<“090000”)和(dt>“060000”)”只是说我只对早上6点到9点访问的网站感兴趣。我怎么说“只计算每天早上6点之前访问的前五个网站”?任何一天都有数百行,并且这些行是按时间顺序排列的

我对每天计算前五个独特的域名感兴趣

导入csv
从集合导入defaultdict
从日期时间导入日期时间
从URL解析导入URL拆分
domains=defaultdict(lambda:defaultdict(int))
以open(“history.csv”、“rb”)作为f:
对于timestr,csv.reader中的url(f):
dt=datetime.strtime(timestr,“%Y-%m-%d%H:%m:%S”)
如果6
我对每天计算前五个独特的域名感兴趣

导入csv
从集合导入defaultdict
从日期时间导入日期时间
从URL解析导入URL拆分
domains=defaultdict(lambda:defaultdict(int))
以open(“history.csv”、“rb”)作为f:
对于timestr,csv.reader中的url(f):
dt=datetime.strtime(timestr,“%Y-%m-%d%H:%m:%S”)
如果6
导入csv
从集合导入defaultdict,计数器
从日期时间导入日期时间
从URL解析导入URL拆分
indiv=计数器()
domains=defaultdict(lambda:defaultdict(int))
以open(“history.csv”、“rb”)作为f:
对于timestr,csv.reader中的url(f):
dt=datetime.strtime(timestr,“%Y-%m-%d%H:%m:%S”)
如果6
导入csv
从集合导入defaultdict,计数器
从日期时间导入日期时间
从URL解析导入URL拆分
indiv=计数器()
domains=defaultdict(lambda:defaultdict(int))
以open(“history.csv”、“rb”)作为f:
对于timestr,csv.reader中的url(f):
dt=datetime.strtime(timestr,“%Y-%m-%d%H:%m:%S”)

如果6
datetime
确实是一条路——当我收到令人恐惧的“发布新答案”消息时,我正在自己工作——但我认为有一些小的调整。我认为,
strtime
以另一种顺序接受它的参数;如前所述,这在第一天之后中断;和
most_common
返回键、值对的列表,而不仅仅是键。但这些都是琐碎的。@DSM:我已经确定了参数顺序。尚不清楚“history.csv”是否包含超过一天的内容。我把它改成接受一天以上。我不明白问题中的输出格式。现在+1。至于输出,我的意思是“\n”.join(etc)不起作用,因为它没有添加字符串..我的凌乱代码确实有所改进,但这并没有解决计算前五天的问题。也许我不清楚…数据中包含了90多天,每天有数百条条目。我只想数一数每一天的前五行。您编写的内容返回了前5个最常见的URL,但在其他方面结果相同。@J.F.Sebastian谢谢–这很接近,但我仍想计算给定主机名的出现次数(仅对每个独特的一天的前五行进行采样)。我尝试在上面重新引入“Counter[urlspit(url).hostname]+=1”,但它返回“TypeError:'type'对象不可订阅”。对不起,不清楚
datetime
无疑是一种方式——当我收到令人恐惧的“发布新答案”消息时,我正在自己工作——但我认为有一些小的调整。我认为,
strtime
以另一种顺序接受它的参数;如前所述,这在第一天之后中断;和
most_common
返回键、值对的列表,而不仅仅是键。但这些都是琐碎的。@DSM:我已经确定了参数顺序。尚不清楚“history.csv”是否包含超过一天的内容。我把它改成接受一天以上。我不明白问题中的输出格式。现在+1。至于输出,我的意思是“\n”.join(etc)不起作用,因为它没有添加字符串..我的凌乱代码确实有所改进,但这并没有解决计算前五天的问题。也许我不清楚…数据中包含了90多天,每天有数百条条目。我只想数一数每一天的前五行。您编写的内容返回了前5个最常见的URL,但在其他方面结果相同。@J.F.Sebastian谢谢–这很接近,但我仍想计算给定主机名的出现次数(仅对每个独特的一天的前五行进行采样)。我尝试在上面重新引入“Counter[urlspit(url).hostname]+=1”,但它返回“TypeError:'type'对象不可订阅”。对不起,不清楚!您所写的是:在早上6点到11点之间访问的前5个独特域中,一个域有多少天。顺便说一句,
indiv+=Counter([domain])
是一种反常的写入
indiv[domain]+=1的方式。您不需要使用
indiv
,您可以使用:
计数器(域中的perday\u域的主机。perday\u域中的主机使用viewvalues())
或者使用
itertools.chain
计数器(chain.from\u iterable(domains.viewvalues())
您所写的是:一个dom有多少天
import csv
from collections import defaultdict
from datetime import datetime
from urlparse import urlsplit

domains = defaultdict(lambda: defaultdict(int))
with open("history.csv", "rb") as f:
     for timestr, url in csv.reader(f):
         dt = datetime.strptime(timestr, "%Y-%m-%d %H:%M:%S")
         if 6 <= dt.hour < 9: # between 6am and 9am
            today_domains = domains[dt.date()] #  per given day
            domain = urlsplit(url).hostname
            if len(today_domains) < 5 or domain in today_domains:
               today_domains[domain] += 1 # count the first 5 unique domains

print(domains)
import csv
from collections import defaultdict, Counter
from datetime import datetime
from urlparse import urlsplit

indiv = Counter()

domains = defaultdict(lambda: defaultdict(int))
with open("history.csv", "rb") as f:
    for timestr, url in csv.reader(f):
        dt = datetime.strptime(timestr, "%Y-%m-%d %H:%M:%S")
        if 6 <= dt.hour < 11: # between 6am and 11am
            today_domains = domains[dt.date()]
            domain = urlsplit(url).hostname
            if len(today_domains) < 5 and domain not in today_domains:
                today_domains[domain] += 1
                indiv += Counter([domain])
for domain in indiv:
    print '%s,%d' % (domain, indiv[domain])