我正在使用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)
答案 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读取代码。当前,它为latitude
,longitude
和windspeed
分配字符串值,并且每次迭代都完全覆盖上一次迭代中读取的任何值。如果要在不覆盖的情况下累积所有值,则需要将变量创建为列表并将其追加。
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"]))