基于Python CSV行值的流控制
我正在使用具有以下结构的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
"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”)
如果6datetime
确实是一条路——当我收到令人恐惧的“发布新答案”消息时,我正在自己工作——但我认为有一些小的调整。我认为,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])