计数给定字符串中的精确字符串,更新计数

时间:2013-04-20 19:15:31

标签: python loops csv

我试图获取给定字符串中的确切字符串的计数,然后在csv文件的行中找到它并更新计数。详细说明:

我有一个示例字符串如下: “5 18; 4 00; 4 00; 5 16; 5 16; 5 16; 5 15; 3 19; 3 16; 3 16; 3 15; 3 15;”。

字符串中的第一个数字是日期(1-7,其中1表示星期一,5表示星期五,等等)。空格后的第二个数字是小时(24小时,其中18是下午6点)。每个条目用分号和空格分隔。

我有一个主文件,包含天(1-7)和小时(00-23)。我按如下方式生成我的日期和时间:

for day in range(1, 8):
    for hour in range(00, 24):
       # Write day + hour, nums.
       writerCommits.writerow([str(day) + " " + str(hour), "0"]); # to write  csv

上面的for循环生成master.csv:

date, count
1 0,0
1 1,0
1 2,0
1 3,0
1 4,0
...
7 19,0
7 20,0
7 21,0
7 22,0
7 23,0

总计169行=(7 x 24)+ 1,其中1是第一行/标题。

到目前为止一切顺利。我需要使用字符串中的count更新master.csv中的值。所以每次发现5 18时它都会增加1。

如果我将此作为我的样本字符串:“1 00; 1 00; 1 00; 5 16;”。我的预期输出将是:

date, count
1 0,3
...
5 16,1
...
7 23, 0

1 个答案:

答案 0 :(得分:0)

使用collections.Counter

import csv
from collections import Counter

strs="1 00; 1 00; 1 00; 5 16;"
c=Counter(tuple(map(int,x.split())) for x in strs.split(";") if x.strip())

#c is Counter({(1, 0): 3, (5, 16): 1})
#here I used a tuple (day,hour) as key and item after `,` as value

with open('master.csv', 'rb') as f1,open("newfile.csv","w") as f2:
     spamreader = csv.reader(f1, delimiter=',')
     header=next(spamreader)
     f2.write(",".join(header)+'\n')
     for row in spamreader:
         key,val=tuple(map(int,row[0].split())),int(row[1])
         #fetch tuple (day,hour) from the current line
         #val is the value after `,`

         val+=c[key] #new value is count from c + count from csv file

         f2.write("{0},{1}\n".format(" ".join(map(str,key)),val))

这将创建一个名为newfile.csv的新文件,该文件现在包含:

date, count
1 0,3
1 1,0
1 2,0
1 3,0
1 4,0
...
7 19,0
7 20,0
7 21,0
7 22,0
7 23,0

将master.csv生成为字符串变量:

In [69]: strs="date, count\n"

In [70]: for day in xrange(1,8):
    for hour in xrange(24):
        strs+="{0} {1},{2}\n".format(day,hour,"0")  #use string formatting
   ....:         

In [71]: print strs
date, count
1 0,0
1 1,0
1 2,0
1 3,0
...
7 21,0
7 22,0
7 23,0