0

だから私は生成されるリストを持っています、例えばmissingfromauthoratativeそしてそのリストで私は2つのことをしたいと思います。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)

また、1行を画面に書き込み、他の3行をcsvに書き込むこともあります。これが私が画面に表示したいものです -MapServerマップ:レイヤーレイヤー:提案された発電サイト-MapServerマップ:レイヤーレイヤー:既存のインフラストラクチャ-MapServerマップ:レイヤーレイヤー:既存のユーティリティサイト-MapServerマップ:レイヤーレイヤー:既存の送電線4つの不整合81.28秒で見つかりました。

これは、csv マップサービスマップインデックスデータフレームレイヤーIDレイヤー名MapServer0レイヤー0提案された発電サイトMapServer0レイヤー1既存のインフラストラクチャMapServer0レイヤー2既存のユーティリティサイトMapServer0レイヤー3既存の伝送ラインに必要なものです

forイテレータの後にそれらを配置しても機能しない理由がわかりません。枯れて仕事をする唯一の方法は、他の人をコメントアウトすることです。

ありがとう

4

2 に答える 2

1

いくつかの問題があります。ループが繰り返されるたびにファイルを再度開くため、毎回ファイルが切り捨てられます。missingFromAuthoritativeまた、最初のバグをマスクして、反復ごとにヘッダーとリスト全体を記述しています。また、リストを反復処理するたびに、クエリから1行を消費しているため、最後に到達するまでに、書き込むものは何も残っていません。

ループの前にファイルを1回開き、ループの前にヘッダーを書き込み、反復ごとにcsvに1行を書き込み、その後ファイルを閉じる必要があります。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)
于 2012-08-21T20:22:14.670 に答える
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
于 2012-08-21T20:18:24.823 に答える