0

我正在尝试获取给定字符串中确切字符串的计数,然后在 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 是第一行/标题。

到现在为止还挺好。我需要使用我的字符串中的计数更新 master.csv 中的值。因此,每次找到 5 18 时,它都会增加 1。

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

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

1 回答 1

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
于 2013-04-20T19:23:09.970 回答