元组|将字符串转换为浮点数

时间:2018-01-30 19:06:39

标签: python csv floating-point tuples

我正在学习用于学习Python的精彩课程教程,而且这段代码似乎不起作用。

#Open File
filename = input("Enter the name of the data file: ")
infile = open(filename, 'r')

#Read in file
datalist = []

for line in infile:
    #Get data from line
    date, l, h, rf = (line.split(','))
    rainfall = float(rf)
    max_temp = float(h)
    min_temp = float(l)
    m, d, y = (date.split('/'))
    month = int(m)
    day= int(d)
    year=int(y)
    #Put data into list
    datalist.append([day,month,year,min_temp,max_temp,rainfall])

我正在尝试导入csv文件,然后创建一个元组。当我将元组中的值转换为浮点数时,会出现问题。它运行正常,直到它通过文件。然后它给我提出了这个错误:

  

Traceback(最近一次调用最后一次):文件   “C:/用户/德夫林/ PycharmProjects / untitled3 /詹姆斯   程序/ Weather.py“,第16行,降雨量=浮点数(rf)   ValueError:无法将字符串转换为float:`

关于做错什么的任何想法?

3 个答案:

答案 0 :(得分:1)

如果没有看到输入文件本身,很难说出你到底做错了什么,但这里看起来有点不对(除了你文件中的值似乎是以逗号分隔并且你可能更好的事实关闭使用Python stdlib的csv模块)是你在遍历行时遇到一个字符串,并试图将其转换为float,这是不行的:

>>> float('spam')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: 'spam'

其中一个解决方案是简单地跳过你遇到的字符串,你可以选择两种方法(LBYL (Look Before You Leap) vs EAFP (Easier to Ask for Forgiveness than Permission)),简而言之,我建议你由于检查和使用之间存在差距,因此通常首选后者,这意味着事情可能会从您的下方发生变化,并且在任何情况下您都必须处理错误,即使您先检查也是如此。除此之外,我建议使用with语句作为上下文管理器,而不是手动关闭类似文件的对象(您似乎忘了这么做),它会自动为您管理。因此,考虑到所有这些因素,以下几行应该可以解决问题(免责声明:未经过彻底测试):

import csv

data = []

filename = input('Enter the name of the data file: ')

with open(filename) as f:
    reader = csv.reader(f, delimiter=',', skipinitialspace=True)
    for line in reader:
        try:
            date, (l, h, rf) = line[0], map(float, line[1:])
            m, d, y = map(int, date.split('/'))
        except ValueError as e:
            print('Skipping line: %s [because of: %s]' % (line, e))
            continue
        data.append([d, m, y, l, h, rf])

希望这足以让你回到正轨; - )

答案 1 :(得分:0)

查看您的csv文件。

很难说没有看到文件中的内容,但最可能的解释(根据错误信息)是你有一个第四个值为空的行,例如:

2018-01-30,5,12,

因此,rf变量在解析该行时将为空,并且当您尝试将值转换为float时,您将得到ValueError

另外,关于如何做得更好的一些建议:

  • 您可能希望首先拆分行,然后计算它拥有的数据字段数,然后在将整行分配给date, l, h, rf之前将其丢弃。这样的事情:

`

for line in infile:
    # Get data from line. Use strip() to avoid whitespace
    items = line.strip().split(',')
    if len(items) != 4:
        # skip the iteration - do nothing with that malformed line
        continue
    date, l, h, rf = items

`

  • 您可能希望查看csv module以便轻松阅读/编写csv文件。

答案 2 :(得分:0)

错误意味着您尝试转换浮点数的字符串实际上不是数字。在你的情况下,它看起来像一个空字符串。这可能是因为你文件的最后一行是空的,所以你可以在循环开始时检查它,如果是,则可以中断或继续。另一种策略是捕获错误,但是当你想要收到错误消息时,它会忽略一个格式错误的行,所以你可以选择适合你的那个。

使用方括号也会将值放在列表中,而不是元组中。你需要括号。

完成后你也应该关闭文件。

Python也有CSV module你可能会觉得有用。

#Open File
filename = input("Enter the name of the data file: ")
infile = open(filename, 'r')

#Read in file
datalist = []

for line in infile:
    if line.strip() == '': # If the line only contains spaces
        continue           # Then, just skip it

    # Some stuff ...

    # Put everything in a tuple that we add to our list
    datalist.append((day,month,year,min_temp,max_temp,rainfall))

infile.close() # Close the file