【问题标题】:CSV calulation script not saving the correct amount of columnsCSV 计算脚本未保存正确数量的列
【发布时间】:2013-11-21 11:36:48
【问题描述】:

@Stackoverflow

我有一个脚本,它根据匹配的 3 个条件将三列添加到我的 csv 末尾。

我了解问题所在,代码是从 rdr 重新读取行,而 wrt 是修改后的行,在初始循环之后我尝试遍历 wrt,但代码无法做到这一点。

我的代码:

import csv
import datetime
import copy
from collections import defaultdict

with open(r"FullMergedData.csv") as i, open(r"FullMergedDataWSPSR.csv", "wb") as o:
    rdr = csv.reader(i, delimiter ="|")
    wrt = csv.writer(o, delimiter ="|")

    data, currdate = defaultdict(lambda:[0, 0, 0, 0]), None
    calclist = [6, 7, 19, 23, 25, 26, 35, 62, 64]

    for calc in calclist:
        for counter2, line in enumerate(rdr):
            if counter2 != 0:
                date, name = datetime.datetime.strptime(line[50], '%d/%m/%Y'), line[calc]

                if date != currdate or not currdate:
                    for v in data.itervalues():
                        v[:2] = v[2:]
                    currdate = date

                top,bottom = data[name][0:2]
                try:
                    quotient = float(top)/bottom
                except ZeroDivisionError:
                    quotient = 0
                wrt.writerow(line + data[name][:2]+ [quotient])

                data[name][3] += 1
                if line[38] == "1": data[name][2] += 1 

如果有人可以帮助使此代码正常工作,我将不胜感激。非常感谢 AEA

产生回溯的代码

import csv
import datetime
import copy
from collections import defaultdict

with open(r"FullMergedData.csv") as i, open(r"FullMergedDataWSPSR.csv", "wb") as o:
    rdr = csv.reader(i, delimiter ="|")
    wrt = csv.writer(o, delimiter ="|")

    data, currdate = defaultdict(lambda:[0, 0, 0, 0]), None
    calclist = [6, 7, 19, 23, 25, 26, 35, 62, 64]

    for counter, calc in enumerate(calclist):
        if counter == 0:
            for counter2, line in enumerate(rdr):
                if counter2 != 0:
                    date, name = datetime.datetime.strptime(line[50], '%d/%m/%Y'), line[calc]

                    if date != currdate or not currdate:
                        for v in data.itervalues():
                            v[:2] = v[2:]
                        currdate = date

                    top,bottom = data[name][0:2]
                    try:
                        quotient = float(top)/bottom
                    except ZeroDivisionError:
                        quotient = 0
                    wrt.writerow(line + data[name][:2]+ [quotient])

                    data[name][3] += 1
                    if line[38] == "1": data[name][2] += 1 

        else:
            for line in wrt:
                    date, name = datetime.datetime.strptime(line[50], '%d/%m/%Y'), line[calc]

                    if date != currdate or not currdate:
                        for v in data.itervalues():
                            v[:2] = v[2:]
                        currdate = date

                    top,bottom = data[name][0:2]
                    try:
                        quotient = float(top)/bottom
                    except ZeroDivisionError:
                        quotient = 0
                    wrt.writerow(line + data[name][:2]+ [quotient])

                    data[name][3] += 1
                    if line[38] == "1": data[name][2] += 1 

追溯

Traceback (most recent call last):
  File "C:\mergecalculator.py", line 35, in <module>
    for line in wrt:
TypeError: '_csv.writer' object is not iterable

【问题讨论】:

  • 您看到了什么错误?可以发回溯吗?
  • @SunPowered 添加了我尝试过的代码 + 回溯
  • 你为什么要遍历一个 writer 对象?你想用for line in wrt:做什么?
  • 您不能遍历 csv 写入器。对于类文件对象,迭代器逐行读取文件。你确定你不想遍历rdr,即for line in rdr:
  • @SunPowered 我没有尝试就发布了第一段代码的原因是因为我明白这是错误的。所需的输出应该包括 27 个额外的列,而不是只产生 3 个。因为它没有查看修改后的数据。

标签: python loops python-2.7 csv


【解决方案1】:

我不是 100% 确定这是你想要的,但试试这个逻辑。您想处理 calclist 中的每个项目以生成额外的 3 列。在处理完 calclist 的所有元素后,将生成的额外列添加到该行并写入 csv 文件。

...
for counter2, line in enumerate(rdr):
    extra_cols = []
    for calc in calclist:
        # process data to get extra 3 columns
        extra_cols.extend(data[name][:2]+ [quotient])
    wrt.writerow(line + extra_cols)

【讨论】:

    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多