汇总CSV列,而忽略python之间的标头

时间:2018-06-21 04:33:12

标签: python

我使用庞大的数据集,有时需要我对具有数字的列进行加减。我能够提出一个可以为我完成工作的代码。让我们以下面的示例为例:

public class DaySliderFragmentAdapter extends FragmentStatePagerAdapter {

    private static final int NUM_PAGES = 2;

    public DaySliderFragmentAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return new DaySliderFragment();
    }

    @Override
    public int getCount() {
        return NUM_PAGES;
    }
}

下面的代码如果在flag_s字段中找到“ B”,则会减去“金额”字段:

for(int i=1; i<=10;i++)
{
    if($request->input('time'.i)!=null && $request->input('OT_Date'.i)!=null)
    {
        $Date = array('' => , );
        $num++;
    }
}            

现在我面临的问题是:有时会有多个CSV文件。我们通常需要附加它们,然后在它们上运行代码。假设我得到一个csv文件A,然后得到一个csv文件B;我需要附加两个文件,然后运行总和代码。如果我们以以下示例为例:

id,flag_s,amount
1,A,10
2,B,20
3,A,30

Python抛出以下错误:

import csv
with open("MOCK_DATA with text qualifier.csv","r+",encoding='utf8') as fin:
    headerline = fin.readline()

flag = None
debit = 0
value = 0
for row in csv.reader(fin,delimiter=","):

    value =row[2].strip()
    value = float(row[2]) if value else 0.0
    flag = row[1].strip()
    if flag == "B":
        debit-=value
    else:
        debit+=value
print (debit)

是否可以解决这个问题?

2 个答案:

答案 0 :(得分:1)

您应该使用try/except语句:

try:
    value = float(row[2]) if value else 0.0
except ValueError: # A header, perhaps
    continue       # Skip the row

答案 1 :(得分:0)

此处,此代码适用于您的用例。

import csv
with open("MOCK_DATA with text qualifier.csv","r+",encoding='utf8') as fin:
    headerline = fin.readline()

    flag = None
    debit = 0
    value = 0
    for row in csv.reader(fin, delimiter=","):

        try:
            value = float(row[2].strip())
        except ValueError:
            value = 0.0

        flag = row[1].strip()
        if flag == "B":
            debit-=value
        else:
            debit+=value
    print (debit)