我正在研究读取xls文件(MHTML格式)的程序(Python 2.7)。我遇到的问题之一是文件包含不是ascii的符号/字符。我最初的解决方案是使用unicode读取文件
这是我读取文件的方式:
theString=unicode(open(excelFile).read(),'UTF-8','replace')
然后,我使用lxml进行一些处理。这些文件有很多表,处理的第一步要求我找到正确的表。我可以根据第一行第一个单元格中的单词找到该表。这是棘手的地方。我曾希望使用正则表达式来测试单元格的text_content(),但发现单词的变体太多(在3,200个文件的测试运行中,我发现91种不同的方式定义了仅一种因此,我决定将特定单元格的所有text_contents转储出去,并使用excel中的一些算法来严格识别所有变体。
我用来编写text_content()的代码是
headerDict['header_'+str(column+1)]=encode(string,'Latin-1','replace')
我这样做是基于先前对类似我的问题的回答,似乎共识是使用unicode读取文件,然后在文件被写出之前对其进行编码。
因此,我在excel中处理了标签/单词-将它们全部转换为小写并消除了空格,并将输出保存为文本文件。
文本文件中有一列列出了我要查找的表的所有独特方式
然后,我正在读取文件-第一次使用来读取文件
labels=set([label for label in unicode(open('C:\\balsheetstrings-1.txt').read(),'UTF-8','replace').split('\n')])
我运行了程序,发现未发生某些匹配,对此进行了调查,结果发现unicode用\ ufffd替换了某些字符,如以下示例所示
u'unauditedcondensedstatementsoffinancialcondition(usd\ufffd$)inthousands'
更多的研究表明,当unicode没有字符映射时会发生替换(可能不是确切的解释,但这是我的解释)
因此,我尝试(在考虑了必须丢失的内容之后)在不使用unicode的情况下阅读标签列表。因此,我使用以下代码阅读了它:
labels=set(open('C:\\balsheetstrings-1.txt').readlines())
现在在看口译器中看到相同的标签
'unauditedcondensedstatementsoffinancialcondition(usd\xa0$)inthousands'
然后,我尝试使用这组标签进行匹配,但出现此错误
Warning (from warnings module):
File "C:\FunctionsForExcel.py", line 128
if tableHeader in testSet:
UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
现在令人沮丧的是,tableHeader的值不在测试集中。当我要求tableHeader的值打破后,我收到了这个
'fairvaluemeasurements:'
并且在我将测试输入“空闲”时增加侮辱性伤害
tableHeader in testSet
它正确地返回false
我知道代码“ \ xa0”是不间断空格的代码。当我在不使用unicode的情况下阅读Python时,也是如此。我以为我已经摆脱了excel中的所有空格,但是为了处理这些,我先将它们拆分,然后再加入
labels=[''.joiin([word for word in label.split()] for label in labels])
我还没有一个问题。抱歉,我仍在努力解决这个问题。在我看来,我正在处理不一致的行为。当我最初读取该字符串并使用unicode和UTF-8时,如果可以的话,所有字符都可以保留/传输。我对它们进行了编码以将其写出,并且它们在Excel中可以正常显示,然后将它们另存为txt文件,它们看起来还不错,但是发生了一些事情,我似乎不知道该在哪里。
如果我可以避免写出字符串来标识正确的标签,我会感觉问题会消失,但是有20,000个或更多标签。我可以使用正则表达式大大减少我的潜在列表,但是其中一些仅需要检查。
顺便说一句,我将注意到源文件都指定了charset ='UTF-8'
回顾-当我使用unicode读取sourcedocument和标签列表时,我无法进行某些匹配,因为标签中的某些字符已被ufffd替换,并且当我使用unicode和标签列表读取源文档时,没有进行任何特殊处理得到警告。
我想了解正在发生的事情,因此我可以修复它,但是我已经用尽了所有可以想到的地方
最佳答案
我知道代码“ \ xa0”是不间断空格的代码。
在一个字节字符串中,\xA0
是用几种编码表示不间断空格的字节。其中最有可能的是Windows代码页1252(西欧)。但这肯定不是UTF-8,其中字节\xA0
本身是无效的。
使用.decode('cp1252')
将该字节字符串而不是'utf-8'
转换为Unicode。通常,如果您想知道HTML文件的编码方式,请在<meta http-equiv="Content-Type">
标记中查找charset参数;根据导出内容的不同,它可能会有所不同。
关于python - 我如何更好地处理涉及Unicode字符以及从ASCII来回往返的编码和解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9445835/