3

最近、python プロジェクトを継承しましたが、説明に苦労している動作がいくつかあります。

コードには 2 つのセクションがあり、ファイルをデータベースにインポートしたり、データベースを出力ファイルにダンプしたりできます。インポートは次のようになります。

def importStuff(self):
    mysqlimport_args = ['mysqlimport', '--host='+self.host, '--user='+self.username, '--password='+self.password, '--fields-terminated-by=|', '--lines-terminated-by=\n', '--replace', '--local', self.database, filename, '-v']
    output = check_output(mysqlimport_args)

ダンプは次のようになります。

def getStuff(self):
    db = MySQLdb.connect(self.host, self.username, self.password, self.database)
    cursor = db.cursor()
    sql = 'SELECT somestuff'
    cursor.execute(sql)
    records = cursor.fetchall()
    cursor.close()
    db.close()
    return records

def toCsv(self, records, csvfile):
    f = open(csvfile, 'wb')
    writer = csv.writer(f, quoting=csv.QUOTE_ALL)
    writer.writerow(['StuffId'])
    count = 1
    for record in records:
        writer.writerow([record[0]])

    f.close()

あなたが今までに見た中で最も美しいpythonではありません(もっと知りたいので、スタイルのコメントは大歓迎です)が、それは妥当なようです.

しかし、消費者から、出力が UTF-8 ではないという苦情がありました (ちなみに、mysql テーブルは utf8 エンコーディングを使用しています)。プログラムが次のように実行される場合、ここで迷子になります。

importStuff(...)

getStuff(...)

toCsv(...)

次に、出力ファイルが有効な utf-8 ではないようです。実行を2つの異なるステップに分割すると

importStuff(...)

その後、別のファイルで

getStuff(...)

toCsv(...)

突然、出力が有効な utf-8 として表示されます。回避策があるという事実を除けば、この動作を説明できないようです。ここで私が間違っていることに誰かが光を当てることができますか? または、何が起こっているのかを明確にするために私が提供できる情報は他にありますか?

ありがとう。

(それが考慮される場合のpython 2.7)

編集: 要求に応じてコードを追加します。私の会社などの罪のない人を保護するためにいくつかの微調整を行いましたが、多かれ少なかれここにあります:

def main():

    dbutil = DbUtil(config.DB_HOST, config.DB_DATABASE, config.DB_USERNAME, config.DB_PASSWORD)
    if(args.import):
        logger.info('Option: --import')

        try:
            dbutil.mysqlimport(AcConfig.DB_FUND_TABLE)
        except Exception, e:
            logger.warn("Error occured at mysqlimport. Error is %s" % (e.message))

    if(args.db2csv):
        try:
            logger.info('Option: --db2csv')
            records = dbutil.getStuff()
            fileutil.toCsv(records, csvfile)
        except Exception, e:
            logger.warn("Error Occured at db2csv. Message:%s" %(e.message))

main()

そしてそれはそれについてです。これは非常に短いため、これはあまり明白ではありません。

忠実に表現する方法がわからない出力は、次のようになります。

"F0NR006F8F"

それらはすべて多かれ少なかれ ASCII 文字のように見えるので、どのような問題が発生するのかわかりません。多分私は間違った角度からこれに取り組んでいます.私は現在、ファイルのエンコーディングについてテキストエディタの最良の推測に依存しています.ファイルの読み取りを停止させている文字をどのように検出するのが最善かわかりません. utf-8として。

4

1 に答える 1

0

史上最も愚かな答え。入力データが UTF-8 ではありませんでした。誰かが、utf-8 以外の文字を utf-8 に変換するために定期的に呼び出される別の sproc を作成することで、これを解決しました。コードを 2 つのファイルに分割して別々に実行するのにかかった時間で、ジョブは実行されました。たまたまそのように実行して、4〜5回試してみたところ、誤った結論に至りました。システムに奇妙な競合状態が隠れないように、utf-8 以外の入力ソースに対応するように読み取りプロセスを変更しています。このグースチェイスで皆さんをリードして申し訳ありません。

于 2012-11-12T22:23:03.183 に答える