2016-06-20 3 views
1

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

HostType,Number 
Windows_Desktop,84 
Linux_Desktop,12 
Windows_Desktop,60 
Linux_Desktop,7 

Я пытаюсь написать скрипт, который выполняет функцию, основанную на общей стоимости. Таким образом, у меня есть две глобальные переменные:

WINDOWS = 0 
LINUX = 0 

Я пытаюсь сделать так, чтобы функция добавляет два числа Window_Desktop вместе, и номера Linux_Desktop вместе. Так что-то вроде ..

def count_function(): 
    global WINDOWS 
    global LINUX 
    count_file = open('counts.csv', 'rb') 
    reader = csv.reader(count_file) 
    WINDOWS = float(row[2]) + float(otherrow[2]) 
    LINUX = float(row[2]) + float(otherrow[2]) 

(я знаю, что это очень неправильно синтаксис, лишь краткий пример того, что я пытаюсь выяснить) Но я не знаю, как определить столбец и строку, я хочу к добавить вместе. Они всегда в одном месте. Windows всегда 2 и 4, Linux всегда в 3 и 5. Поэтому мне не нужно их регулярное выражение. Я просто пытаюсь понять, как сделать Row 2 Колонка 2 + строка 4 Колонка 2.

В принципе, я в конечном счете, пытаюсь сделать что-то вроде:

if WINDOWS < 80 
    some_function() 

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

ответ

3

Вам необходимо определить тип вещи, которую вы собираете, анализируя содержимое первого столбца. Поскольку вы собираете Windows и Linux totalals, вы можете использовать словарь для сбора этих данных.

Попробуйте эту версию:

import csv 
from collections import defaultdict 

data = defaultdict(float) # this just means, the default value of a key 
          # that doesn't exit is a float 

with open('yourfile.csv') as f: 
    reader = csv.reader(f) 
    next(f) # This will skip the header 
    for row in reader: 
     data[row[0].split('_')[0].strip()] += float(row[1]) 

if data['Windows'] < 80: 
    print('Do stuff') 

for key, value in data.iteritems(): 
    print('Value for {} is {}'.format(key, value)) 
+0

Извините за поздний ответ, но то, что вы сказали, работал отлично, спасибо большое за помощь. – Mallachar

1

Я настоятельно рекомендую использовать Pandas package. Это очень полезно для работы с csv-файлами.

import pandas as pd 

df = pd.read_csv("/Users/daddy30000/Dropbox/Stackoverflow/16_06_20_example.csv") 

windows = df[df['HostType'] == 'Windows_Desktop'].sum()[1] 
linux = df[df['HostType'] == 'Linux_Desktop'].sum()[1] 

print windows 
>>> 144 
print linux 
>>> 19 

Обратите внимание, что я предполагаю, что все ваши строки Windows имеют одинаковое правописание «Windows_Desktop». В примере вы используете два разных написания.

+0

Вы правы, я исправил его. – Mallachar

1

Один из способов сделать это, как так:

with open("/tmp/foo.txt", 'r') as input_file: 
    counts = {} 
    for line in input_file: 
     split_line = line.split(",") 
     device = split_line[0] 
     counts[device] = int(split_line[1]) + (counts.get(device) or 0) 

    print counts ## prints {'Windows_Desktop': 144, 'Linux_Desktop': 19} 

Есть много способов, но один не требует импорта или загрузки ничего нового в Python

1

Для таких, как небольшой набор данных, Я прочитал все это в памяти и использовал индексы (немного отличающиеся от ваших), чтобы напрямую обращаться к соответствующим строкам и столбцам. Я также не вижу никакой необходимости в использовании global переменных (или почему вы используете float вместо int):

import csv 

def count_desktops(filename): 
    with open(filename, 'rb') as count_file: 
     data = list(csv.reader(count_file)) 
     windows = float(data[1][1]) + float(data[3][1]) 
     linux = float(data[2][1]) + float(data[4][1]) 
     return windows, linux 

windows, linux = count_desktops('counts.csv') 

if windows < 80: 
    some_function() 
Смежные вопросы