最近、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として。