Execute SQL from Python:格式化结果集
Execute SQL from Python: Format the result set
我有一个 python 脚本可以让我 query a GIS database using SQL 在 Python:
import sys
import arcpy
try:
arcpy.env.workspace = sys.path[0]
egdb_conn = arcpy.ArcSDESQLExecute(r"Database Connections\Connection1.sde")
--> sql_statement = """SELECT * FROM USER1.A_TEST_TABLE"""
sql_statement_list = sql_statement.split(";")
print("+++++++++++++++++++++++++++++++++++++++++++++\n")
# For each SQL statement passed in, execute it.
for sql in sql_statement_list:
print(sql)
try:
egdb_return = egdb_conn.execute(sql)
except Exception as err:
print(err)
egdb_return = False
if isinstance(egdb_return, list):
for row in egdb_return:
print(row)
print("+++++++++++++++++++++++++++++++++++++++++++++\n")
else:
if egdb_return == True:
print("SQL statement: {0} ran successfully.".format(sql))
else:
print("SQL statement: {0} FAILED.".format(sql))
print("+++++++++++++++++++++++++++++++++++++++++++++\n")
except Exception as err:
print(err)
脚本工作正常,但输出有点难以阅读:
+++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM INFRASTR.A_TEST_TABLE
[1, u'1', u'APPLE', 0.1]
[2, u'2', u'PEAR', 0.2]
[3, u'3', u'BANANA', 0.3]
[4, u'4', u'MANGO', 0.4]
[5, u'5', u'ORANGE', 0.5]
[6, u'6', u'BLUEBERRY', 0.6]
[7, u'7', u'STRAWBERRY', 0.7000000000000001]
[8, u'8', u'RASPBERRY', 0.8]
[9, u'9', u'KIWI', 0.9]
[10, u'10', u'PINEAPPLE', 1.0]
+++++++++++++++++++++++++++++++++++++++++++++
如果结果集能够以更传统的 table 格式输出,将会很有帮助。这样的东西会很棒(虽然我不喜欢这个确切的布局):
OBJECTID ID TYPE COST
1 1 APPLE 0.01
2 2 PEAR 0.02
3 3 BANANA 0.03
4 4 MANGO 0.04
5 5 ORANGE 0.05
6 6 BLUEBERRY 0.06
7 7 STRAWBERRY 0.07
8 8 RASPBERRY 0.08
9 9 KIWI 0.09
10 10 PINEAPPLE 1.00
我该怎么做?我不确定如何设置值的格式,因为它们在列表中。我不太担心将 COST
格式化为货币;我可以在 SQL.
中做到这一点
您可以将输出传递给字典和 pandas 数据框。可能有更有效的方法,但像这样的方法会起作用。
import pandas
s = []
for row in egdb_return:
r = []
r.append(row)
d = {}
d["ObjectId"] = r.[1]
d["ID"] = r[2]
d["Type"] = r[3]
d["Cost"] = r[4]
s.append(d)
Table = pandas.dataframe(s)
print(Table)
print(("{:<15}"*len(row)).format(*row))
将为您提供 len(row)
左对齐列:
>>> row = [1, 3.4, "Pie", "pi", "a"]
>>> print(("{:<15}"*len(row)).format(*row))
1 3.4 Pie pi a
这只是做 "{:<15}"*len(row)
以获得 "{:<15}{:<15}...{:<15}"
然后格式化行中的值。
我有一个 python 脚本可以让我 query a GIS database using SQL 在 Python:
import sys
import arcpy
try:
arcpy.env.workspace = sys.path[0]
egdb_conn = arcpy.ArcSDESQLExecute(r"Database Connections\Connection1.sde")
--> sql_statement = """SELECT * FROM USER1.A_TEST_TABLE"""
sql_statement_list = sql_statement.split(";")
print("+++++++++++++++++++++++++++++++++++++++++++++\n")
# For each SQL statement passed in, execute it.
for sql in sql_statement_list:
print(sql)
try:
egdb_return = egdb_conn.execute(sql)
except Exception as err:
print(err)
egdb_return = False
if isinstance(egdb_return, list):
for row in egdb_return:
print(row)
print("+++++++++++++++++++++++++++++++++++++++++++++\n")
else:
if egdb_return == True:
print("SQL statement: {0} ran successfully.".format(sql))
else:
print("SQL statement: {0} FAILED.".format(sql))
print("+++++++++++++++++++++++++++++++++++++++++++++\n")
except Exception as err:
print(err)
脚本工作正常,但输出有点难以阅读:
+++++++++++++++++++++++++++++++++++++++++++++
SELECT * FROM INFRASTR.A_TEST_TABLE
[1, u'1', u'APPLE', 0.1]
[2, u'2', u'PEAR', 0.2]
[3, u'3', u'BANANA', 0.3]
[4, u'4', u'MANGO', 0.4]
[5, u'5', u'ORANGE', 0.5]
[6, u'6', u'BLUEBERRY', 0.6]
[7, u'7', u'STRAWBERRY', 0.7000000000000001]
[8, u'8', u'RASPBERRY', 0.8]
[9, u'9', u'KIWI', 0.9]
[10, u'10', u'PINEAPPLE', 1.0]
+++++++++++++++++++++++++++++++++++++++++++++
如果结果集能够以更传统的 table 格式输出,将会很有帮助。这样的东西会很棒(虽然我不喜欢这个确切的布局):
OBJECTID ID TYPE COST
1 1 APPLE 0.01
2 2 PEAR 0.02
3 3 BANANA 0.03
4 4 MANGO 0.04
5 5 ORANGE 0.05
6 6 BLUEBERRY 0.06
7 7 STRAWBERRY 0.07
8 8 RASPBERRY 0.08
9 9 KIWI 0.09
10 10 PINEAPPLE 1.00
我该怎么做?我不确定如何设置值的格式,因为它们在列表中。我不太担心将 COST
格式化为货币;我可以在 SQL.
您可以将输出传递给字典和 pandas 数据框。可能有更有效的方法,但像这样的方法会起作用。
import pandas
s = []
for row in egdb_return:
r = []
r.append(row)
d = {}
d["ObjectId"] = r.[1]
d["ID"] = r[2]
d["Type"] = r[3]
d["Cost"] = r[4]
s.append(d)
Table = pandas.dataframe(s)
print(Table)
print(("{:<15}"*len(row)).format(*row))
将为您提供 len(row)
左对齐列:
>>> row = [1, 3.4, "Pie", "pi", "a"]
>>> print(("{:<15}"*len(row)).format(*row))
1 3.4 Pie pi a
这只是做 "{:<15}"*len(row)
以获得 "{:<15}{:<15}...{:<15}"
然后格式化行中的值。