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

Python 元组|将字符串转换为浮点数,python,csv,floating-point,tuples,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(',')) rainfal

下面是学习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文件,然后创建一个元组。当我将元组中的值转换为浮点值时,就会出现问题。它可以正常工作,直到它在文件中运行为止。然后它向我展示了这个错误:

回溯最近的调用上次:文件 C:/Users/Devlin/PycharmProjects/untitled3/James's Programs/Weather.py,第16行,单位:降雨量=floatrf ValueError:无法将字符串转换为浮点:`

有没有关于我做错了什么的想法?

查看您的csv文件

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

2018-01-30,5,12

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

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

您可能希望首先拆分行,然后计算它有多少数据字段,然后在将整行指定为date、l、h、rf之前丢弃它。大概是这样的: `

`

您可能需要查看用于轻松读取/写入csv文件的。
该错误意味着您试图转换浮点的字符串实际上不是数字。在您的情况下,它看起来像是一个空字符串。这可能是因为文件的最后一行是空的,所以您可以在循环开始时检查它,如果是空的,则中断或继续。另一种策略是捕获错误,但当您希望收到错误通知时,它会忽略格式错误的线路,因此由您选择适合您的线路

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

完成后还应关闭文件

Python还有一个很有用的工具

#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

如果看不到输入文件本身,很难判断您到底做错了什么,但除了文件中的值似乎是逗号分隔的,而且您最好使用Python stdlib的模块,因为在迭代行时,您在某处遇到了字符串,并试图将其转换为浮动,这是一个不可能的过程:

>>> float('spam')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: 'spam'
希望这足以让你回到正轨-

>>> float('spam')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: 'spam'
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])