我试图获取给定字符串中的确切字符串的计数,然后在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
答案 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