我有一个(令人沮丧的)谜团我需要帮助解决。我有一个MySQL表,其中包含一个存储URL的列,特别是last.fm上轨道的URL。我想法我确保将它们存储在他们的转义html格式中(例如“ünloco”变成“'%C3%BCnloco”),因为我正在使用拉丁语校对(不是utf-8),但是有些奇怪的事情正在发生。
我使用mysqldump备份了表,截断了表,然后尝试使用标准的“load data infile”语法重新导入相同的数据。
但是在阅读~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~没有错误,没有警告......就好像MySQL认为文件比实际更短。
在将文件读入Python之后,事实证明它在一行中有一个十六进制字符(例如\ xa0)失败了。也就是说,它会读取所有行,直到它达到那一行。我通过删除该行并再次尝试来验证这是问题,然后将数据加载到带有十六进制字符的 next 行并停止。
所以这些字符肯定是问题所在,但我不知道它们是如何在表中结束的(拉丁校对不应该不允许这样吗?)。更重要的是,我现在如何将数据恢复到数据库中?
我是否必须手动编辑转储的文本文件并删除/编辑这些行,或者有没有办法让MySQL正确读取文件?在前一种情况下,我如何有效地找到有问题的行(命令行或Python解决方案赞赏...有太多的行来手动检查)。
编辑以包含有问题的行的示例,我学到的第一个是:
for i,line in enumerate(open(filename)):
if i==350616:
break
print line
350317 2 sevish 346067 \N á sevish/_/á
print repr(line)
'350317\t2\tsevish\t346067\t\\N\t\xa0\tsevish/_/\xa0\n'
答案 0 :(得分:0)
(我假设\ xa0是文件中的单个字节,而且你在Windows上。)
以二进制模式打开。
file = open(fname, 'rb')
否则,它采用ASCII并且可以在非ASCII字符(\ x80左右等)上中断。
注意:您将从读取操作而不是字符串中获取字节数组。您可能需要使用str
转换输入,这可能仍会在非ASCII上中断。
在二进制模式下,您不应使用next
(将文件用作可迭代文件),readline
或readlines
,因为它们会查找ASCII。请改用read
。
答案 1 :(得分:0)
好的,所以我终于想出了一种方法,或多或少地简单地找到哪些线路有问题:
for line in open(filename):
try:
line.decode('ascii')
except:
print line
基本上,我尝试解码ascii中的行,如果这不起作用,我打印该行。这拉出了相关的行,并允许我编辑它们,以便MySQL可以正确地读取它们。
这当然没有解决这些值如何,但至少让我解决了这个问题。