如何将列表字符串转换为浮点数

时间:2018-10-26 14:09:20

标签: python csv floating-point

我正在使用Python乌龟来绘制飓风艾玛的路线。读取文件并获取有用的数据(纬度,经度和风速)之后,我在代码映射部分无法接受字符串的过程中遇到了错误。但是,当我尝试将列表值转换为float时,它给了我ValueError:无法将字符串转换为float:'。'。我尝试使用.split,但随后出现错误:没有足够的值可解包。

#open the file and extract the data
    with open("irma.csv", 'rt') as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            latitude = row["Lat"]
            longitude = row["Lon"]
            windspeed = row["Wind"]

#convert to float
    latitude = [float(i) for i in latitude]
    longitude = [float(i) for i in longitude]

#mapping the data to the Python turtle function
    for lat, lon in latitude, longitude:
        t.setpos(lat, lon)
        for index in windspeed:
            if index < 74:
                t.pencolor("White")
                t.width(2)
            elif 74 <= index <= 95:
                t.pencolor("Blue")
                t.width(4)
            elif 96 <= index <= 110:
                t.pencolor("Green")
                t.width(6)
            elif 111 <= index <= 129:
                t.pencolor("Yellow")
                t.width(8)
            elif 130 <= index <= 156:
                t.pencolor("Orange")
                t.width(10)
            elif windspeed >= 157:
                t.pencolor("Red")
                t.width(12)

2 个答案:

答案 0 :(得分:0)

此行:

latitude = [float(i) for i in latitude]

会遍历您纬度中的每个字符,包括“。”。无法将其转换为float。经度同样是问题。

您在这里不需要列表理解。简单地:

latitude = float(latitude)

应该是您要查找的内容,除非纬度和经度对象包含其他字符。

不过,这似乎不是您唯一的问题。您的for row in reader循环每次通过都会覆盖纬度和经度。

考虑到这一点,请考虑使用类似以下的内容:

with open("irma.csv", 'rt') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        lat = float(row["Lat"])
        lon = float(row["Lon"])
        windspeed = row["Wind"]
        t.setpos(lat, lon)
        for index in windspeed:
            if index < 74:
                t.pencolor("White")
                t.width(2)
            elif 74 <= index <= 95:
                t.pencolor("Blue")
                t.width(4)
            elif 96 <= index <= 110:
                t.pencolor("Green")
                t.width(6)
            elif 111 <= index <= 129:
                t.pencolor("Yellow")
                t.width(8)
            elif 130 <= index <= 156:
                t.pencolor("Orange")
                t.width(10)
            elif windspeed >= 157:
                t.pencolor("Red")
                t.width(12)

答案 1 :(得分:0)

latitude = [float(i) for i in latitude]

此行有问题。 latitude以字符串开头,例如"100.5"。当您执行[float(i) for i in latitude]时,Python会遍历该字符串中的每个字符,并尝试将其转换为浮点数,从而有效地做到了:

latitude = [float("1"), float("0"), float("0"), float("."), float("5")]

但是float(".")失败,因为您不能将小数点转换为浮点数。

我猜测您实际上打算让latitude作为字符串的 list 开始,在执行此行后,它将成为浮点数列表。如果是这种情况,那么您需要修改您的csv读取代码。当前,它为latitudelongitudewindspeed分配字符串值,并且每次迭代都完全覆盖上一次迭代中读取的任何值。如果要在不覆盖的情况下累积所有值,则需要将变量创建为列表并将其追加。

latitude = []
longitude = []
windspeed = []
#open the file and extract the data
with open("irma.csv", 'rt') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        latitude.append(row["Lat"])
        longitude.append(row["Lon"])
        windspeed.append(row["Wind"])

这本身就足够了,但是您也可以删除float-conversion列表解析,并直接在此循环中直接进行转换。 (同时,让我们对变量名称进行复数处理,这在处理列表数据时很常见)

latitudes = []
longitudes = []
windspeeds = []
#open the file and extract the data
with open("irma.csv", 'rt') as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        latitudes.append(float(row["Lat"]))
        longitudes.append(float(row["Lon"]))
        windspeeds.append(float(row["Wind"]))