2015-10-25 2 views
1

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

пример файла:

jan2000,4.5 
feb2000,9 
jan2001,9.0 
feb2001,8.9 

и так далее ..

Я знаю, как открыть файл и преобразовать файл в list используя split и strip.

Я не понимаю, как добавить определенные элементы в список, потому что мои данные имеют почти 50 лет, а его тупой идеей - для утверждений if.

+0

Нужно ли начинать где-то посередине? –

ответ

0
import csv # let's let the csv module handle the details of reading a csv file 
import collections # we'll need a defaultdict to track all the data 

# open the file we want to read from and the file we want to write to 
with open("path/to/input") as infile, open("path/to/output", 'w') as fout: 
    outfile = csv.writer(fout, delimiter=',') # let the csv library handle csv.writer handle the details of writing the actual data to the file 
    months = collections.defaultdict(int) # keep track of the input data 
    for month, val in csv.reader(infile, delimiter=','): 
     val = float(val) 
     month = month[:3] # we don't need the year 
     months[month] += val # add to the running total 
    for month in 'jan feb mar apr may jun jul aug sep oct nov dec'.split(): # we need a list of all the months in proper order 
     outfile.writerow([month, months[month]) # get the value from the data we've been tracking 
0

В open, strip и split функции являются приемлемыми для чтения CSV файлов, возможно, было бы проще использовать module like this.

Чтение CSV становится:

import csv 
with open('fiftyyears.csv', newline='') as csvfile: 
    reader = csv.reader(csvfile) 
    for row in reader: 
     do_something(row) 

Я не уверен, что туп об использовании, если заявления, но формат даты вы перечисляете в качестве примера является немного странным. Кроме того, 10 строк реальных данных были бы более полезными, чтобы ответить на ваш вопрос.

Существует множество способов решения вашего требования к соответствию месяца. Базовый подход будет примерно таким:

import csv 

class MonthCorrelator(object): 
    def __init__(self, month): 
     self.month = month 

    def process(self, row): 
     # code goes here to say "if the row's month is my month then..." 

    def finish(self): 
     # code goes here to print the result 

processor = MonthCorrelator('jan2000') # or, better, use datetime 

with open('fiftyyears.csv', newline='') as csvfile: 
    reader = csv.reader(csvfile) 
    for row in reader: 
     processor.process(row) 

processor.finish() 

... который будет работать, но может быть больше кода, чем вам нужно.

Если все, что вы хотите сделать, это

  • Считанные данные
  • фильтр определенные строки
  • на этих строках сделать сумму

затем посмотреть в итераторы, predicates for a filter и built-in sum function ,

+0

От тупых я имел в виду, что у меня есть 50 лет данных, и есть 12 месяцев в году, добавляя до почти 600, если утверждения с учетом одного за каждый месяц определенного года – Luke

+0

600 строк ... тривиально. 50Gb CSV более интересен, и даже тогда все еще отлично.Я думаю, что вы имеете в виду что-то более разумное, чем делать заявления «если» в каждом из 12 месяцев, что справедливо. Я думал, что вы ищете определенный месяц, но я думаю, вы имеете в виду корреляцию всех месяцев. В любом случае, итераторы и фильтры будут полезны для вашей проблемы. –

0

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

with open("path/to/input") as infile, open("path/to/output", 'w') as outfile: 
    months = {} 
    for line in infile: 
     month, val = line.strip().split(',') 
     val = float(val) 
     month = month[:3] 
     if month not in months: 
      months[month] = 0 
     months[month] += val 
    for month in 'jan feb mar apr may jun jul aug sep oct nov dec'.split(): 
     outfile.write(','.join([month, str(months[month]))) 
+0

Я до сих пор не понимаю, как добавить в месяц соответствующее значение месяца. Например, в течение 3 лет jan будет иметь 3 разных значения. Теперь, как добавить только эти значения в список и исключить другие месяцы во время итерации. Большое спасибо за помощь – Luke

+0

Поскольку вы хотите получить итоговые значения, вам не нужно отслеживать фактические значения - просто используйте текущую сумму за каждый месяц, которую вы можете отслеживать в словаре. Поэтому я создал словарь под названием «месяцы», в котором ключи являются именами месяцев, а значения - это сумма за соответствующий месяц (ключ) – inspectorG4dget

0

Там нет другого пути, чтобы найти элементы, которые нужны, кроме сканирования каждых из них на «ян "

Компьютеры очень быстрые, и это операция с сложностью O (n) (не такая сложная). Я думаю, что ваш ответ будет выглядеть примерно так, если вы будете разбирать CSV-файл в список месяцев и значения

isJan = False 
sum = 0.0 
for item in monthList: 
    if isJan: 
     sum += float(item) 
    if "jan" in item: 
     isJan = True 
    else: 
     isJan = False 
print sum