ValueError:float()的文字无效:读取纬度和经度数据

gee*_*.24 0 python matplotlib

给出以下脚本来读取纬度,经度和幅度数据:

#!/usr/bin/env python

# Read in latitudes and longitudes
eq_data = open('lat_long')

lats, lons = [], []

for index, line in enumerate(eq_data.readlines()):
    if index > 0:
        lats.append(float(line.split(',')[0]))
        lons.append(float(line.split(',')[1]))

#Build the basemap
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

antmap = Basemap(projection='spstere', boundinglat=-20, lon_0=-60, resolution='f')
antmap.drawcoastlines(color='0.50', linewidth=0.25)
antmap.fillcontinents(color='0.95')

x,y = antmap(lons, lats)
antmap.plot(x,y, 'r^', markersize=4)
plt.show()
Run Code Online (Sandbox Code Playgroud)

尝试阅读纬度,经度和幅度时,我收到以下错误:

Traceback (most recent call last):
  File "./basic_eqplot.py", line 10, in <module>
    lats.append(float(line.split(',')[0]))
ValueError: invalid literal for float(): -18.381  -172.320  5.9
Run Code Online (Sandbox Code Playgroud)

输入文件类似于:

-14.990,167.460,5.6
-18.381,-172.320,5.9
-33.939,-71.868,5.9
-22.742,-63.571,5.9
-2.952,129.219,5.7
Run Code Online (Sandbox Code Playgroud)

为什么会导致打嗝的任何想法?

chu*_*ash 5

您的输入文件中似乎有一行或多行损坏的数据.你的追溯说明了:

ValueError: invalid literal for float(): -18.381  -172.320  5.9
Run Code Online (Sandbox Code Playgroud)

特别是发生了什么:

  1. 该行-18.381 -172.320 5.9从eq_data读入.
  2. split(',')在字符串上调用"-18.381 -172.320 5.9".由于字符串中没有逗号,因此该split方法返回一个包含单个元素的列表,即原始字符串.
  3. 您尝试将返回的数组的第一个元素解析为float.该字符串"-18.381 -172.320 5.9"无法解析为浮点数并且ValueError引发a.

要解决此问题,请仔细检查输入数据的格式.您也可以尝试在try/except块中包含此代码段,以便为您提供有关问题特定来源的更多有用信息:

for index, line in enumerate(eq_data.readlines()):
    if index > 0:
        try:
            lats.append(float(line.split(',')[0]))
            lons.append(float(line.split(',')[1]))
        except ValueError:
            raise ValueError("Unable to parse input file line #%d: '%s'" % (index + 1, line))
Run Code Online (Sandbox Code Playgroud)


小智 5

可能发生的是你的输入文件有一个格式错误的行,其中一个空格用于分隔字段而不是逗号.

因此,结果line.split(',')[0]是整个输入行(在您的情况下"-18.381 -172.320 5.9").

更一般地说:对于这些类型的问题,我真的想使用Python cvs模块来解析输入文件:

import csv
with open('lat_long', 'r') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        assert len(row) == 3
        lst, lon, mag = row
        ...
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用像熊猫这样的工具; 但在某些情况下这可能有点矫枉过正.