1

我正在尝试使用 cur.fetchall 命令将 Oracle 11g 中的单个数组下载到 Python 中。我正在使用以下语法:

 con = cx_Oracle.connect('xxx')
 print con.version
 cur = con.cursor()
cur.execute("select zc.latitude from  orders o, zip_code zc where o.date> '24-DEC-12'     and TO_CHAR(zc.ZIP_CODE)=o.POSTAL_CODE")
latitudes = cur.fetchall()
cur.close()
print latitudes

当我打印纬度时,我得到了这个:

[(-73.98353999999999,), (-73.96565,), (-73.9531,),....]

问题是当我尝试操作数据时——在这种情况下,通过:

x,y = map(longitudes,latitudes)

我收到以下错误 - 请注意,我正在使用相同类型的语法来创建“经度”:

TypeError: a float is required

我怀疑这是因为 cur.fetchall 在元组元素内返回带有逗号的元组。如何运行查询,这样我就不会得到括号内的逗号,而是得到一个数组而不是一个元组?是否有像 cur.fetchall 这样的不错的“全部捕获”命令,还是我必须手动循环才能将结果放入数组中?

我的完整代码如下:

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np
import cx_Oracle
con = cx_Oracle.connect('xxx')
print con.version
cur = con.cursor()
cur.execute("select zc.latitude from  orders o, zip_code zc where     psh.ship_date> '24-DEC-12' and TO_CHAR(zc.ZIP_CODE)=o.CONSIGNEE_POSTAL_CODE")
latitudes = cur.fetchall()
cur.close()

cur = con.cursor()
cur.execute("select zc.longitude from  orders o, zip_code zc where psh.ship_date> '24-DEC-12' and TO_CHAR(zc.ZIP_CODE)=o.CONSIGNEE_POSTAL_CODE")
longitudes = cur.fetchall()
print 'i made it!'
print latitudes
print longitudes
cur.close()
con.close()
map = Basemap(resolution='l',projection='merc',         llcrnrlat=25.0,urcrnrlat=52.0,llcrnrlon=-135.,urcrnrlon=-60.0,lat_ts=51.0)
# draw coastlines, country boundaries, fill continents.
map.drawcoastlines(color ='C')
map.drawcountries(color ='C')
map.fillcontinents(color ='k')
# draw the edge of the map projection region (the projection limb)
map.drawmapboundary()
# draw lat/lon grid lines every 30 degrees.
map.drawmeridians(np.arange(0, 360, 30))
map.drawparallels(np.arange(-90, 90, 30))
plt.show()
# compute the native map projection coordinates for the orders.
x,y = map(longitudes,latitudes)
# plot filled circles at the locations of the orders.
map.plot(x,y,'yo')
4

3 回答 3

1

尾随逗号很好,它是有效的元组语法以及当您print使用元组时得到的内容。

我不知道你想要实现什么,但地图可能不是你想要的。map 接受一个函数和一个列表作为参数,但你给它 2 个列表。更有用的方法可能是一起从数据库中检索纬度和经度:

cur.execute("select zc.longitude, zc.latitude from  orders o, zip_code zc where o.date> '24-DEC-12'     and TO_CHAR(zc.ZIP_CODE)=o.POSTAL_CODE")

更新评论

从原始代码看来,您正在尝试使用内置map函数,而更新后的代码并非如此。

你得到的原因TypeError是 matplotlib 需要一个浮点列表,但你提供的是一个元组的列表。您可以使用简单的列表理解从原始纬度中解开元组(内置的地图也可以解决问题):

[row[0] for row in latitudes]

使用一个查询返回纬度和经度:

cur.execute("select zc.longitude, zc.latitude from...")
points = cur.fetchall()
longitudes = [point[0] for point in longitudes]
latitudes = [point[1] for point in latitudes]

现在longitudeslatitudes是浮动列表。

于 2012-12-26T20:53:17.103 回答
0

找到了解决这个问题的另一种方法——查看TypeError: "list indices must be integers" looping through tuples in python。感谢您为帮助我而付出的辛勤工作!

于 2012-12-26T22:07:34.900 回答
0

我遇到了同样的问题,一种解决方法是清除循环中的元组元素中的逗号,如您所提到的(虽然效率不高),如下所示:

cleaned_up_latitudes=[] #initialize the list
for x in xrange(len(latitudes)):
    pass
cleaned_up_latitudes.append(latitudes[x][0]) #add first element
print cleaned_up_latitudes

[-73.98353999999999, -73.96565, -73.9531,....]

我希望这会有所帮助。

于 2016-12-01T22:47:20.207 回答