我编写了一个python脚本来将pgRouting(在PostgreSQL中)的输出存储在CSV文件中,并且代码和CSV文件的一部分看起来像,
import sys, os
os.chdir('C:\Users\Heinz\Desktop')
print os.getcwd()
#set up psycopg2 environment
import psycopg2
#driving_distance module
query = """
select *
from shortest_path ($$
select
gid as id,
source::int4 as source,
target::int4 as target,
pi::double precision as cost,
pi_rcost::double precision as reverse_cost
from network
$$, %s, %s, %s, %s
)
"""
#make connection between python and postgresql
conn = psycopg2.connect("dbname = 'TC_area' user = 'postgres' host = 'localhost' password = 'xxxx'")
cur = conn.cursor()
#count rows in the table
cur.execute("select count(*) from network")
result = cur.fetchone()
k = result[0] + 1 #number of points = number of segments + 1
#run loops
#import csv module
import csv
import tempfile
import shutil
rs = []
i = 1
l = 1
filename = 'test.csv'
with open(filename, 'wb') as f:
while i <= k:
while l <= k:
cur.execute(query, (i, l, False, True))
rs.append(cur.fetchall())
element = list(rs)
writer = csv.writer(f, delimiter = ',')
writer.writerow(element)
rs = []
l = l + 1
l = 1
i = i + 1
conn.close()
现在我想做三件事,
如何做到这一点?我能一步完成这项任务吗?
我在Windows 8.1 x64下使用python 2.7.4和PostgreSQL 8.4。
更新#1 我在我的脚本中添加了以下两行(谢谢,shaktimaan),
[a[-1] for a in element]
product = reduce(lambda x,y: x * y, [a[-1] for a in element])
这是输出的一部分,
答案 0 :(得分:1)
实质上,您需要知道的是如何对列表中的所有元素进行多重化。这可以使用reduce()
方法完成,如下所示:
reduce(lambda x,y: x * y, a_list)
现在,查看代码,csv中的每个条目都由语句生成:
element = list(rs)
例如,element
可以拥有:
[(1, -1, 0.0), (1, 1, 0.844), (2, -1, 0)]
您需要将每个内部元组的第三个数相乘。因此,动态创建一个列表,提取每个子元组的第三个元素
[a[-1] for a in element]
现在将其插入前一个reduce()
:
product = reduce(lambda x,y: x * y, [a[-1] for a in element])
这会打印0.0
以上示例。现在您已拥有该产品,请在输出CSV中使用该产品以及如何将其打印出来。
希望它有所帮助。