所以我有一个生成的列表,例如missfromauthoratative和那个列表我想做两件事。 1.在屏幕上打印结果; 2.将结果写入csv文件。
凭借我所拥有的,它会做一个或另一个,或者有时组合。下面的代码就是我所拥有的。
#Find what is missing or new
missingFromAuthoritative = dBase.execute('SELECT url, mapindex, mapname, layerid, layername FROM authoritative EXCEPT SELECT url, mapindex, mapname, layerid, layername FROM current;')
newToAuthoritative = dBase.execute('SELECT url, mapindex, mapname, layerid, layername FROM current EXCEPT SELECT url, mapindex, mapname, layerid, layername FROM authoritative;')
#Print missing services (-) and new services (+)
for missing in missingFromAuthoritative:
print '-', missing[0], '\n Map: ', missing[2], '\n Layer:', missing[4], '\n'
self.inconsistency += 1
outcsv = csv.writer(open('missing.csv', "wb"))
header = ("Map Service","Map Index","Data Frame","Layer ID","Layer Name")
outcsv.writerow(header)
outcsv.writerows(missingFromAuthoritative)
它有时也会向屏幕写一行,而另外三行写入csv。 这就是我想要的屏幕 - MapServer 地图:图层 层:建议的发电站点 - MapServer 地图:图层 层:现有基础架构 - MapServer 地图:图层 图层:现有公用事业站点 - MapServer 地图:图层 图层:现有传输线 在81.28秒内发现4个不一致。
这就是我想要的csv 映射服务映射索引数据帧层ID层名称 MapServer 0层0建议的发电站点 MapServer 0层1现有基础架构 MapServer 0层2现有公用站点 MapServer 0层3现有传输线
我不知道为什么在for迭代器之后放置它们不起作用。让枯萎发挥作用的唯一方法是对另一个进行评论。
由于
答案 0 :(得分:1)
你有几个问题。您将在每次循环迭代时重新打开该文件,从而每次都将其截断。您还在每次迭代时编写标题和整个missingFromAuthoritative
列表,屏蔽第一个错误。此外,每次遍历列表时,您都会从查询中消耗一行,所以当您到达结尾时,没有什么可写的。
您应该在循环之前打开文件一次,在循环之前写入标题,在每次迭代时将一行写入csv,然后关闭文件。您可以使用with
块执行此操作:
with open('missing.csv', "wb") as outFile:
outCsv = csv.writer(outFile)
outCsv.write(header)
for missing in missingFromAuthoritative:
# do your other stuff with inconsistencies, etc., here
print missing
outCsv.writerow(missing)
答案 1 :(得分:0)
你的写作正在消耗迭代器。您需要重新构建代码。
伪代码:
Perform query
Open CSV file
Write header to CSV file
For each row in the query:
Display row to screen
Write row to CSV file
Close CSV file