我正在开发一个读取 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:'
当我在 Idle 中输入测试时雪上加霜
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 读取源文档和标签列表时,我无法进行一些匹配,因为标签有一些字符被 ufffd 替换,当我使用 unicode 读取源文档和标签列表时,我没有任何特殊处理我得到警告。
我想了解发生了什么,所以我可以修复它,但我已经用尽了所有我能想到的地方