2012-11-12 25 views
3

我最近繼承了一個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。

+1

您能否提供兩個不同代碼段的示例,以及它們生成的兩個不同結果? – BrenBarn

+1

我認爲還有一些其他的皺紋不是固定的。你注意到的差異不應該導致編碼改變。 –

+0

可能的重複:[用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' ')。 –

回答

0

所有時間都是最愚蠢的答案。輸入數據不是UTF-8。有人通過編寫另一個定期調用的sproc將非utf-8字符轉換爲utf-8來解決這個問題。當我把代碼分解成兩個文件並分別運行它們的時候,作業就開始了。它恰好碰巧以4-5次的方式運行,導致了我的錯誤結論。我現在正在改變讀取過程以適應非UTF-8輸入源,所以我沒有隱藏在系統中的奇怪競態條件。對不起,在這個鵝頸上引導你。