【问题标题】:Tuples | Converting Strings to Floats元组 |将字符串转换为浮点数
【发布时间】:2018-01-30 19:06:39
【问题描述】:

我正在学习 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:/Users/Devlin/PycharmProjects/untitled3/James' Programs/Weather.py",第 16 行,in 降雨量 = float(rf) ValueError:无法将字符串转换为浮点数:`

关于做错了什么有什么想法吗?

【问题讨论】:

    标签: python csv floating-point tuples


    【解决方案1】:

    如果不查看输入文件本身,很难判断你到底做错了什么,但这里似乎有什么问题(除了文件中的值似乎是逗号分隔的,而且你可能会更好关闭使用 Python stdlib 的 csv 模块)是您在遍历行时在某处遇到字符串,并试图将其转换为浮点数,这是不行的:

    >>> 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)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])
    

    希望这足以让您重回正轨;-)

    【讨论】:

      【解决方案2】:

      查看您的 csv 文件。

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

      2018-01-30,5,12,

      因此,rf 变量在解析该行时将为空,而当您尝试将值转换为浮点数时,您会得到 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 文件。

      【讨论】:

        【解决方案3】:

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

        使用方括号还将您的值放在一个列表中,而不是放在一个元组中。你需要括号。

        完成后您还应该关闭文件。

        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
        

        【讨论】:

          猜你喜欢
          • 2011-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多