将文件IO从urllib重写为csvreader

时间:2015-09-01 00:52:15

标签: python matplotlib urllib

我正在尝试重写以下脚本,如下所示: https://github.com/rougier/LinuxMag-HS-2014/blob/master/matplotlib/earthquakes.py

从在线CSV文件中读取地震纬度,经度和幅度数据。我想重写数据输入,以便不是使用urllib,而是从URL读取它,我想使用csv模块读取地震的纬度,经度和幅度。我对如何完美地重写原始脚本的File IO部分感到有些困惑,因此我可以使用自己的CSV文件,而不必将其从互联网上取下(如原件中所示)。

  1. 这里是原始脚本的文件IO部分(与上面的链接相同):

    import urllib
    import numpy as np
    import matplotlib
    matplotlib.rcParams['toolbar'] = 'None'
    import matplotlib.pyplot as plt
    from mpl_toolkits.basemap import Basemap
    from  matplotlib.animation import FuncAnimation
    
    
    # Open the earthquake data
    # -------------------------
    # -> http://earthquake.usgs.gov/earthquakes/feed/v1.0/csv.php
    feed = "http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/"
    # Earthquakes of magnitude > 4.5 in the past 30 days
    url = urllib.urlopen(feed + "4.5_month.csv")
    
    # Set earthquake data
    data = url.read().split('\n')[+1:-1]
    E = np.zeros(len(data), dtype=[('position',  float, 2),
                                   ('magnitude', float, 1)])
    for i in range(len(data)):
        row = data[i].split(',')
        E['position'][i] = float(row[2]),float(row[1])
        E['magnitude'][i] = float(row[4])
    
    
    fig = plt.figure(figsize=(14,10))
    ax = plt.subplot(1,1,1)
    P = np.zeros(50, dtype=[('position', float, 2),
                            ('size',     float, 1),
                            ('growth',   float, 1),
                            ('color',    float, 4)])
    
  2. 这是我重写的开始,包括我自己的CSV文件(不使用urlib)

    import matplotlib
    from pylab import load
    import numpy as np
    from numpy import loadtxt
    from pylab import save
    matplotlib.use('TkAgg')
    matplotlib.rcParams['toolbar'] = 'None'
    import matplotlib.pyplot as plt
    from mpl_toolkits.basemap import Basemap
    from  matplotlib.animation import FuncAnimation
    import csv
    eq_data = open('mycsvfile.csv')
    lats, lons = [], []
    magnitudes = []
    
    with open(eq_data, 'rb') as f:
        reader = csv.reader(f)
        reader.next() # To ignore the first row
        for row in reader:
            lats.append(float(row(1)))
            lons.append(float(row(2)))
            magnitudes.append(float(row[6]))
    # After reading in the csv file, this is where I get confused.    
    
    fig = plt.figure(figsize=(14,7))
    ax = plt.subplot(1,1,1)
    
    # 10 represents the number of simultaneous displayed earthquakes
    P = np.zeros(10, dtype=[('position', float, 2),
                            ('size', float, 1),
                            ('growth', float, 1),
                            ('color',   float, 4)])
    
  3. 我希望弄清楚在读取我自己的CSV文件后,如何在#set地震数据之后重写原始代码部分。有关如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

正如你在评论中所说的那样 -

  

我收到以下错误:

 File "./antarctica_earthquake_anim.py", line 19, 
   in <module> with open(eq_data, 'rb') as f: 
 TypeError: coercing to Unicode: need string or buffer, file found

问题在于行 -

eq_data = open('mycsvfile.csv')
...
with open(eq_data, 'rb') as f:

您首先打开文件eq_data,然后再将其传递给open(),但这不起作用。

open()需要文件名作为第一个参数,而不是file个对象。尝试做 -

 with open('mycsvfile.csv') as f:

在此之前不打开任何eq_data

此外,在您的urllib代码中,您似乎正在使用row[4]来衡量数量,但在您使用csv的{​​{1}}版本中,您应该使用正确的一个在row[6]中(以正确的一个为准)。