我最近繼承了一個python項目,並且我有一些行爲我正在努力解決。Python MySQL UTF-8編碼根據執行順序而不同
該代碼有兩個部分,它可以將文件導入到數據庫中,也可以將數據庫轉儲到輸出文件。進口看起來是這樣的:
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()
好了沒有,你會看到過(風格歡迎評論,因爲我很想了解更多)最漂亮的蟒蛇但似乎是合理的。
但是,我收到了一個消費者的投訴,我的輸出不是UTF-8(mysql表格使用utf8編碼的方式)。這裏就是我迷路了,如果程序執行這樣的:
importStuff(...)
getStuff(...)
toCsv(...)
那麼輸出文件不似乎是有效的UTF-8。當我打破執行分成兩個不同的步驟
importStuff(...)
然後在另一個文件
getStuff(...)
toCsv(...)
突然我的輸出顯示爲有效的UTF-8。除了我有解決問題的事實,我似乎無法解釋這種行爲。任何人都可以闡明我在這裏做錯了什麼?或者我能提供的更多信息可以說明發生了什麼?
謝謝。
(蟒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。
您能否提供兩個不同代碼段的示例,以及它們生成的兩個不同結果? – BrenBarn
我認爲還有一些其他的皺紋不是固定的。你注意到的差異不應該導致編碼改變。 –
可能的重複:[用Python向MySQL寫入UTF-8字符串](http://stackoverflow.com/questions/6202726/writing-utf-8-string-to-mysql-with-python)。我相信你需要:'MySQLdb.connect'調用中的'MySQLdb.connect(use_unicode = True,charset ='utf8')'參數'('use_unicode = True'不是絕對必要的,如果'charset ='utf8' ')。 –