在文件夹中遍历文件并在列中添加值?

2024-05-08 23:58:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有多个文件,其中数据写在两列中,如下所示:

asp 1.88
gln 3.10
arg 0.99
his 1.11

以及

asp 0.99
gln 1.11
arg 0.08
his 0.01

等等。你知道吗

我要做的是将它们相加,然后写入一个新文件,如下所示:

asp 2.87
gln 4.21
arg 1.07
his 1.12

我尝试导入Counter,但效果不好。我也试过这样:

inp = ('c"/users/ansm/desktop/xx.txt','r').read().strip().split('\n')
inp2 = ('c"/users/ansm/desktop/xyz.txt','r').read().strip().split('\n')
c = Counter(inp)
d = Counter(inp2)
print c+d

但这段代码并没有将这些值相加。你知道吗

有没有其他不使用Counter的方法呢? 我使用glob.iglob在文件夹中遍历.txt格式的文件,然后希望对它们进行处理以获得上述结果。使用Counter是最有效的方法还是其他方法更好?你知道吗


Tags: 文件方法txtreadcounterargusersasp
3条回答

使用此构造创建计数器:

c = Counter(dict((x.split()[0], float(x.split()[1])) for x in inp))
d = Counter(dict((x.split()[0], float(x.split()[1])) for x in inp2))

结果c+d将是:

Counter({'gln': 4.21, 'asp': 2.87, 'his': 1.12, 'arg': 1.07})

编辑许多文件:

s = Counter()
for filename in glob.iglob('*.txt'):
    with open(filename, 'r') as f:
        for line in f:
            k, v = line.split()
            s[k] += float(v)
print s
with open('sum.txt', 'w') as f:
    for k, v in sorted(s.iteritems()):
        f.write('{0} {1}\n'.format(k, v))

您必须按如下方式在两个计数器中添加每个元素,因为原始计数器存储的是字符串而不是值的数字(注意float()转换):

r = Counter(c)
for k, v in d.items():
    r[k] += float(v)

现在添加的值位于r。更简单的方法是在创建cd时直接执行转换:

c = Counter((p[0], float(p[1])) for p in map(lambda s: s.split(), inp))
d = Counter((p[0], float(p[1])) for p in map(lambda s: s.split(), inp2))

现在它将按预期工作:

c + d
> Counter({'gln': 4.21, 'asp': 2.87, 'his': 1.12, 'arg': 1.07})

还要注意,读取文件的方式并不是最安全的:打开但从不关闭文件,更好的方法是使用with open,如下所示:

inp = []
with open('c:/users/ansm/desktop/xx.txt', 'r') as input:
    for line in input:
        inp.append(line.strip())

使用defaultdict怎么样:

from collections import defaultdict
import glob

d = defaultdict(float)

for filename in glob.iglob('*.txt'):
    with open(filename, "r") as f:
        for line in f:
            k,v = f.split(" ")
            d[k] += float(v)

with open("output.txt", "w") as out:
    for k, v in d.iteritems:
        out.write("%s %f\n" % (k,v))

相关问题 更多 >

    热门问题