2

我有多个文件,每个文件包含 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函数扫描一个目录,以便将所有文件用作输入。然后必须对每个文件执行上述程序以收集每个文件的结果,然后当然必须将每个文件的所有分析结果写入单个 OUTPUT 文件。

注意:在生成单个 OUTPUT 文件期间,如果发现任何值被重复,那么与其将相同的条目写入两次,不如仅对“计数”求和。例如分析第一个文件生成:

123 6  
111 5  
0   6  
45  5  

和第二个文件生成:

121 9  
111 7  
0   1  
22  2  

在这种情况下,OUTPUT 文件必须以包含以下内容的方式编写:

123 6  
111 12 #sum up count no. in case of similar value entry  
0   7  
45  5  
22  2  

我已经写了编。对于单个文件分析,但我被困在质量分析部分。请帮忙。

4

4 回答 4

2
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-06T12:44:56.140 回答
1

去丑化后:

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()
于 2012-05-07T01:48:03.830 回答
0

在程序顶部初始化一个空字典,比如说,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-06T12:48:49.173 回答
0

我确实喜欢这个。

import glob
out = open("write.txt",'a')  
from collections import Counter  
C = Counter()  
for file in glob.iglob('temp*.txt'):
    for line in open(file,'r').read().strip().split('\n'):  
        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()  
于 2013-01-27T04:49:56.520 回答