处理大型CSV文件的一部分

时间:2015-10-25 03:10:44

标签: python csv

我正在尝试阅读.csv文件并添加相应月份的值。 例如,如果我的文件有3年的数据,我想找到与这些3年中的1月相对应的值的总和。

文件示例:

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

依旧......

我知道如何打开文件并使用listsplit将文件转换为strip

我不明白如何将特定元素附加到列表中,因为我的数据已经有近50年的时间了,而且对于if语句来说这是一个愚蠢的想法。

4 个答案:

答案 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

答案 1 :(得分:0)

可以使用openstripsplit函数来阅读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)

我不确定使用if语句是什么愚蠢,但你列出的日期格式有点奇怪。此外,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 filterbuilt-in sum function

答案 2 :(得分:0)

如果你想自己完成所有繁重的工作,而不需要从标准库中获得太多帮助:

<div class="relativeWrap" ng-repeat="phone in phonenumbers">
     <input placeholder="Phone Number" pattern="[0-9]{10}" ng-maxlength="10" maxlength="10" type="text" class="form-control input-text phone_number" name="phonenumber[]" ng-model="phone.text" ng-required="!isValue" ng-change="textChange">
</div>

答案 3 :(得分:0)

没有其他方法可以找到除了扫描每个元素之外你需要的元素&#34; jan&#34;

计算机非常快,这是一种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