首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python求和csv中的列

问用Python求和csv中的列
EN

Stack Overflow用户
提问于 2018-06-08 11:20:03
回答 2查看 96关注 0票数 2

我使用大型csv文件,并希望测试我们是否可以使用Python对一个数字列进行求和。我生成了一个随机数据集:

代码语言:javascript
复制
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行中,您将注意到缺少值(我删除了这些数据,以便进行测试)。

我写了代码:

代码语言:javascript
复制
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)

我发现了一个错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "sum_csv1_v2.py", line 11, in <module>
    value+= float(value)
TypeError: must be str, not float

由于我是Python新手,我的计划是将空单元格转换为零,但我想我在这里遗漏了一些东西。另外,我的脚本是基于逗号分隔的文件,但我确信它不适用于其他分隔文件。你能帮我改进这段代码吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-08 11:28:33

原始异常,现在已在编辑历史中丢失,

代码语言:javascript
复制
TypeError: replace() argument 2 must be str, not int

是str.replace()期望字符串参数的结果,但您要传递一个整数零。您可以在转换之前检查空字符串,而不是替换:

代码语言:javascript
复制
value = row[5]
value = float(value) if value else 0.0

另一种选择是捕获潜在的ValueError

代码语言:javascript
复制
try:
    value = float(row[5])

except ValueError:
    value = 0.0

这可能隐藏了一个事实,即该列包含“无效”值,而不仅仅是缺少值。

请注意,如果您传递了字符串参数,最终结果可能不是您预期的那样:

代码语言:javascript
复制
In [2]: '123'.replace('', '0')
Out[2]: '0102030'

In [3]: float(_)
Out[3]: 102030.0

您可以看到一个空字符串,因为“指针”将替换字符串中的每个字符。

在修复其他错误之后,问题中的最新异常是float(value)转换工作和

代码语言:javascript
复制
value += float(value)

等于:

代码语言:javascript
复制
value = value + float(value)

当异常状态时,字符串和浮点不混合。

票数 1
EN

Stack Overflow用户

发布于 2018-06-08 11:31:55

代码的问题是,您调用replace()时不检查它的row[5]是否为空。

固定代码:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
542.0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50759525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档