<p>您可以使用<code>OrderedDict</code>将名称存储为值,并在运行时更新计数:</p>
<pre><code>import csv
from collections import OrderedDict
od = OrderedDict()
with open("test.txt") as f:
r = csv.reader(f)
head = next(r)
for name,val in r:
od.setdefault(name, 0)
od[name] += int(val)
print(od)
OrderedDict([('a@a.com', 25), ('b@a.com', 8), ('c@a.com', 2)])
</code></pre>
<p>要更新原始文件,可以将其写入NamedTemporaryFile,然后在使用od.items将行写入writerows后,使用shutil.move替换原始文件:</p>
<pre><code>import csv
from collections import OrderedDict
from shutil import move
from tempfile import NamedTemporaryFile
od = OrderedDict()
with open("test.txt") as f, NamedTemporaryFile(dir=".",delete=False) as out:
r = csv.reader(f)
wr = csv.writer(out)
head = next(r)
wr.writerow(head)
for name,val in r:
od.setdefault(name, 0)
od[name] += int(val)
wr.writerows(od.iteritems())
move(out.name,"test.txt")
</code></pre>
<p>输出:</p>
<pre><code>E-mail,M-count
a@a.com,25
b@a.com,8
c@a.com,2
</code></pre>
<p>如果您不关心订单,请改用defaultdict:</p>
<pre><code>import csv
from collections import defaultdict
from shutil import move
from tempfile import NamedTemporaryFile
od = defaultdict(int)
with open("test.txt") as f, NamedTemporaryFile(dir=".",delete=False) as out:
r = csv.reader(f)
wr = csv.writer(out)
head = next(r)
wr.writerow(head)
for name,val in r:
od[name] += int(val)
wr.writerows(od.iteritems())
</code></pre>