gpt4 book ai didi

Python MySQL UTF-8 编码因执行顺序而异

转载 作者:行者123 更新时间:2023-11-28 19:25:53 24 4
gpt4 key购买 nike

我最近继承了一个 Python 项目,但我遇到了一些我难以解释的行为。

代码有两部分,它可以将文件导入数据库,也可以将数据库转储到输出文件。导入看起来像这样:

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。当我将执行分成两个不同的步骤时

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。

最佳答案

有史以来最愚蠢的答案。输入数据不是 UTF-8 格式。有人通过编写另一个存储过程来解决这个问题,该存储过程将被定期调用以将非 utf-8 字符转换为 utf-8。在我将代码分成两个文件并分别运行它们的过程中,作业运行了。它只是碰巧以这种方式运行了 4-5 次,导致我得出错误的结论。我现在正在更改读取过程以适应非 utf-8 输入源,因此我没有隐藏在系统中的奇怪竞争条件。很抱歉让大家陷入困境。

关于Python MySQL UTF-8 编码因执行顺序而异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13351427/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com