2014-11-26 9 views
1

Недавно я только начал изучать модуль csv. Предположим, у нас есть этот CSV-файл:Python: Эффективное чтение из файла с использованием модуля csv

John,Jeff,Judy, 
21,19,32, 
178,182,169, 
85,74,57, 

И мы хотим, чтобы прочитать этот файл и создать словарь, содержащий имена (в качестве ключей) и итогов каждого столбца (как значения). Так что в этом случае мы бы в конечном итоге с:

d = {"John" : 284, "Jeff" : 275, "Judy" : 258} 

Так что я написал этот код, по-видимому, работает хорошо, но я не доволен, и было интересно, если кто знает лучше или более эффективным/элегантный способ сделать это. Потому что есть только слишком много линий в там: D (Или, может быть, как мы могли бы обобщить его немного - то есть мы не знаем, сколько полей есть.)

d = {} 
import csv 
with open("file.csv") as f: 
    readObject = csv.reader(f) 

    totals0 = 0 
    totals1 = 0 
    totals2 = 0 
    totals3 = 0 

    currentRowTotal = 0 
    for row in readObject: 
     currentRowTotal += 1 
     if currentRowTotal == 1: 
      continue 

     totals0 += int(row[0]) 
     totals1 += int(row[1]) 
     totals2 += int(row[2]) 
     if row[3] == "": 
      totals3 += 0 

f.close() 

with open(filename) as f: 
    readObject = csv.reader(f) 
    currentRow = 0 
    for row in readObject: 
     while currentRow <= 0: 
      d.update({row[0] : totals0}) 
      d.update({row[1] : totals1}) 
      d.update({row[2] : totals2}) 
      d.update({row[3] : totals3}) 
      currentRow += 1 
    return(d) 
f.close() 

Большое спасибо за любой ответ :)

ответ

0

Используйте верхний ряд, чтобы выяснить, что такое заголовки столбцов. Инициализировать словарь итогов на основе заголовков.

import csv 

with open("file.csv") as f: 
    reader = csv.reader(f) 

    titles = next(reader) 
    while titles[-1] == '': 
    titles.pop() 
    num_titles = len(titles)  
    totals = { title: 0 for title in titles } 

    for row in reader: 
    for i in range(num_titles): 
     totals[titles[i]] += int(row[i]) 

print(totals) 

Позвольте мне добавить, что вы не должны закрывать файл после with блока. Весь смысл with в том, что он заботится о закрытии файла.

Кроме того, позвольте мне отметить, что данные, которые вы размещены по-видимому, четыре колонки:

John,Jeff,Judy, 
21,19,32, 
178,182,169, 
85,74,57, 

Вот почему я сделал это:

while titles[-1] == '': 
    titles.pop() 
0

Это немного грязный, но попробуйте это (операционные без пустой последней колонки):

#!/usr/bin/python 

import csv 
import numpy 

with open("file.csv") as f: 
    reader = csv.reader(f) 
    headers = next(reader) 

    sums = reduce(numpy.add, [map(int,x) for x in reader], [0]*len(headers)) 
    for name, total in zip(headers,sums): 
     print("{}'s total is {}".format(name,total)) 
3

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

import pandas as pd 
df = pd.read_csv('data.csv') 
print(dict(df.sum())) 

Дает:

{'Jeff': 275, 'Judy': 258, 'John': 284} 
0

Основание на решение Michasel, я хотел бы попробовать с меньшим количеством кода и меньше переменных и не зависимость от Numpy:

import csv 

with open("so.csv") as f: 
    reader = csv.reader(f) 
    titles = next(reader) 
    sum_result = reduce(lambda x,y: [ int(a)+int(b) for a,b in zip(x,y)], list(reader)) 

    print dict(zip(titles, sum_result)) 
Смежные вопросы