我使用大型csv文件并想测试我们是否可以求和数字 使用Python的专栏。我生成了一个随机数据集:
id,first_name,last_name,email,gender,money
1,Clifford,Casterou,ccasterou0@dropbox.com,Male,53
2,Ethyl,Millichap,emillichap1@miitbeian.gov.cn,Female,58
3,Jessy,Stert,jstert2@gnu.org,Female,
4,Doy,Beviss,dbeviss3@dedecms.com,Male,80
5,Josee,Rust,jrust4@epa.gov,Female,13
6,Hedvige,Ahlf,hahlf5@vkontakte.ru,Female,67
在第3行,您会注意到该值已丢失(我删除了该数据) 目的是测试。)
我写了代码:
import csv
with open("mock_7.txt","r+",encoding='utf8') as fin:
headerline = fin.readline()
amount = 0
debit = 0
value = 0
for row in csv.reader(fin):
# var = row.rstrip()
value =row[5].replace('',0)
value= float(value)
debit+=value
print (debit)
我收到了错误:
Traceback (most recent call last):
File "sum_csv1_v2.py", line 11, in <module>
value+= float(value)
TypeError: must be str, not float
由于我是Python的新手,我的计划是将空单元格转换为零,但我想我在这里遗漏了一些东西。此外,我的脚本基于逗号分隔文件,但我确信它不适用于其他分隔文件。你能帮我改进这段代码吗?
答案 0 :(得分:1)
原始例外,现在已在编辑历史记录中丢失,
TypeError: replace() argument 2 must be str, not int
是str.replace()
期望字符串参数的结果,但是您传递的是整数零。而不是替换你可以在转换之前简单地检查空字符串:
value = row[5]
value = float(value) if value else 0.0
另一种选择是捕捉潜在的ValueError
:
try:
value = float(row[5])
except ValueError:
value = 0.0
这可能会隐藏列包含&#34;无效&#34;除了缺失值之外的其他值。
请注意,如果您传递了字符串参数,那么最终结果可能不是您所期望的:
In [2]: '123'.replace('', '0')
Out[2]: '0102030'
In [3]: float(_)
Out[3]: 102030.0
正如你可以看到一个空字符串作为&#34;针&#34;最终取代字符串中的每个字符。
在修复其他错误后,问题中的最新例外是float(value)
转换工作的结果和
value += float(value)
等于:
value = value + float(value)
并且作为例外情况,字符串和浮点数不会混合。
答案 1 :(得分:0)
您的代码出现问题的原因是您在调用replace()
而未检查其row[5]
是否为空。
固定代码:
import csv
with open("mock_7.txt","r+",encoding='utf8') as fin:
headerline = fin.readline()
amount = 0
debit = 0
value = 0
for row in csv.reader(fin):
# var = row.rstrip()
if row[5].strip() == '':
row[5] = 0
value = float(row[5])
value += float(value)
debit += value
print (debit)
<强>输出:强>
542.0