2015-06-11 6 views
3

Я пытаюсь добавить определенные значения из файла CSV, если пользователь тот же. Я не могу объяснить это четко, поэтому я постараюсь показать вам.Добавление определенных полей из csv

===================== 
|E-mail | M-count | 
|[email protected] | 12  | 
|[email protected] | 8  | 
|[email protected] | 13  | 
|[email protected] | 2  | 
===================== 

Затем он пытается добавить все, что принадлежит к определенному пользователю:

===================== 
|E-mail | Total | 
|[email protected] | 25  | 
|[email protected] | 8  | 
|[email protected] | 2  | 
===================== 

Я расколоть CSV и добавил значения, что мне нужно в наборе, но я не могу думать о способ добавить нужные мне значения. Есть идеи?

Edit:

Это то, что мой CSV выглядит следующим образом:

p_number,duration,clnup# 
5436715524,00:02:26,2 
6447654246,00:17:18,5 
5996312484,00:01:19,1 
5436715524,00:10:12,6 

Я хотел бы получить общую продолжительность и общий clnup # для каждого уникального p_number. Я сожалею о путанице, но приведенная выше таблица была просто примером.

+0

лучше показать нам некоторый фрагмент файла и некоторый код, что вы сделали –

+0

я редактировал пост. Что касается кода, в настоящее время он просто считывает CSV. – user5000054

ответ

0
import csv 

ifile = open('sample.csv', 'rb') 
csv_reader = csv.reader(ifile) 

d = {} 
for row in csv_reader: 
    d[row[0]] = int(row[1]) if d.get(row[0], None) is None else d[row[0]] + int(row[1]) 
from pprint import pprint 
pprint(d) 
+0

Я попробую это и обновлю тему. Спасибо! – user5000054

+0

@ user5000054, вы много хотите пропустить первую строку ввода csv, если она содержит заголовок. –

1

Вы можете использовать OrderedDict хранящие имена в качестве значений и обновляют счетчик, как вы идете:

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([('[email protected]', 25), ('[email protected]', 8), ('[email protected]', 2)]) 

Чтобы обновить исходный файл можно записать в NamedTemporaryFile затем использовать shutil.move заменить оригинал после того, как вы написали строки с writerows использованием od.items:

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") 

Выход:

E-mail,M-count 
[email protected],25 
[email protected],8 
[email protected],2 

Если вы не заботитесь о заказе использовать defaultdict вместо:

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()) 
+0

Спасибо, сэр! На самом деле это действительно интересно, мне никогда не приходило в голову, что я могу использовать этот метод. Я это попробую! – user5000054

+0

@ user5000054, не беспокойтесь, это предполагает, что данные размещены и разделены запятой –

Смежные вопросы