python - 我如何更好地处理涉及Unicode字符以及从ASCII来回往返的编码和解码

标签 python unicode non-ascii-characters

我正在研究读取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/

相关文章:

c - 如何在 ANSI C 中打印重音字符(如 á é í ó ú)

python - 使用 SimpleCookie 清除 cookie

rust - 获取字符的控制台宽度

Django - 在管理页面中显示 "Model Object"而不是对象标题

java - 在正则表达式解析中处理 Unicode 单词

r - R 中的非 ASCII 字符,从 .sav 文件中读取

Python 字典计数

python - 如何反转 CANTERA Python 模块中的 adiabetic.py 程序,使其输入绝热温度并给出输出入口温度?

python - TypeError 'Profile' 对象不可迭代

java - 找不到为什么 jmxRemoteURL 包含非 ASCII 字符