添加两个不同的特定csv列的值

时间:2016-06-20 23:02:48

标签: python 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中。所以我不需要以任何方式对它们进行正则表达。我只想弄清楚如何进行第2行第2列+第4行第2列。

基本上,我最终会尝试做类似的事情:

if WINDOWS < 80
    some_function()

虽然我已经找到了这个部分,但是我把这些数字加起来,即使我猛击了多少次,我也似乎无法弄明白。

4 个答案:

答案 0 :(得分:3)

您需要通过分析第一列的内容来确定您要收集的东西的类型。由于您要收集WindowsLinux总计,因此您可以使用字典来收集这些数据。

试试这个版本:

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

答案 1 :(得分: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”。您在示例中使用了两种不同的拼写。

答案 2 :(得分: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

答案 3 :(得分: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()