我有多个文件,每个文件包含8/9列。
对于单个文件:我必须读取包含一些值的最后一列,并计算每个值出现的次数,然后生成一个输出文件。
我这样做了:
inp = open(filename,'r').read().strip().split('\n')
out = open(filename,'w')
from collections import Counter
C = Counter()
for line in inp:
k = line.split()[-1] #as to read last column
C[k] += 1
for value,count in C.items():
x = "%s %d" % (value,count)
out.write(x)
out.write('\n')
out.close()
现在的问题是,如果我必须为一个输入生成一个输出,那么它可以很好地工作。但我需要使用glob.iglob
函数扫描一个目录,查找要用作输入的所有文件。然后必须对每个文件执行上述程序以收集每个文件的结果,并且当然必须将每个文件的所有分析结果写入单个输出文件中。
注意:在生成单个输出文件期间,如果发现有任何值重复,则最好只对“count”求和,而不是将同一条目写两次。例如,第一个文件的分析生成:
123 6
111 5
0 6
45 5
和第二个文件生成:
121 9
111 7
0 1
22 2
在这种情况下,输出文件的编写方式必须包含:
123 6
111 12 #sum up count no. in case of similar value entry
0 7
45 5
22 2
我已经写好了程序。用于单文件分析,但我被困在质量分析部分。请帮帮忙。
发布于 2012-05-06 20:48:49
在程序的顶部初始化一个空字典,假设是dic=dict()
并且对于每个Counter
更新dic
,以使相似键的值被求和,并且新键也被添加到dic
要更新dic
,请使用以下命令:
dic=dict( (n, dic.get(n, 0)+C.get(n, 0)) for n in set(dic)|set(C) )
其中C
是当前的Counter
,在所有文件完成后,将dic
写入输出文件。
import glob
from collections import Counter
dic=dict()
g_iter = glob.iglob(r'c:\\python32\fol\*')
for x in g_iter:
lis=[]
with open(x) as f:
inp = f.readlines()
for line in inp:
num=line.split()[-1]
lis.append(num)
C=Counter(lis)
dic=dict( (n, dic.get(n, 0)+C.get(n, 0)) for n in set(dic)|set(C) )
for x in dic:
print(x,'\t',dic[x])
发布于 2012-05-06 20:44:56
from collections import Counter
import glob
out = open(filename,'w')
g_iter = glob.iglob('path_to_dir/*')
C = Counter()
for filename in g_iter:
f = open(filename,'r')
inp = f.read().strip().split('\n')
f.close()
for line in inp:
k = line.split()[-1] #as to read last column
C[k] += 1
for value,count in C.items():
x = "%s %d" % (value,count)
out.write(x)
out.write('\n')
out.close()
发布于 2012-05-07 09:48:04
去丑化后:
from collections import Counter
import glob
def main():
# create Counter
cnt = Counter()
# collect data
for fname in glob.iglob('path_to_dir/*.dat'):
with open(fname) as inf:
cnt.update(line.split()[-1] for line in inf)
# dump results
with open("summary.dat", "w") as outf:
outf.writelines("{:5s} {:>5d}\n".format(val,num) for val,num in cnt.iteritems())
if __name__=="__main__":
main()
https://stackoverflow.com/questions/10470436
复制相似问题