首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中分析多个文件后生成单个输出文件

在python中分析多个文件后生成单个输出文件
EN

Stack Overflow用户
提问于 2012-05-06 20:21:31
回答 4查看 404关注 0票数 2

我有多个文件,每个文件包含8/9列。

对于单个文件:我必须读取包含一些值的最后一列,并计算每个值出现的次数,然后生成一个输出文件。

我这样做了:

代码语言:javascript
运行
复制
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”求和,而不是将同一条目写两次。例如,第一个文件的分析生成:

代码语言:javascript
运行
复制
123 6  
111 5  
0   6  
45  5  

和第二个文件生成:

代码语言:javascript
运行
复制
121 9  
111 7  
0   1  
22  2  

在这种情况下,输出文件的编写方式必须包含:

代码语言:javascript
运行
复制
123 6  
111 12 #sum up count no. in case of similar value entry  
0   7  
45  5  
22  2  

我已经写好了程序。用于单文件分析,但我被困在质量分析部分。请帮帮忙。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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写入输出文件。

代码语言:javascript
运行
复制
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])
票数 0
EN

Stack Overflow用户

发布于 2012-05-06 20:44:56

代码语言:javascript
运行
复制
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()
票数 2
EN

Stack Overflow用户

发布于 2012-05-07 09:48:04

去丑化后:

代码语言:javascript
运行
复制
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()
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10470436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档