【发布时间】: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