Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何更好地处理涉及unicode字符的编码和解码以及从ascii码来回转换_Python_Unicode_Non Ascii Characters - Fatal编程技术网

Python 如何更好地处理涉及unicode字符的编码和解码以及从ascii码来回转换

Python 如何更好地处理涉及unicode字符的编码和解码以及从ascii码来回转换,python,unicode,non-ascii-characters,Python,Unicode,Non Ascii Characters,我正在开发一个程序(Python2.7),它可以读取xls文件(MHTML格式)。我遇到的问题之一是,文件包含非ascii的符号/字符。我最初的解决方案是使用unicode读取文件 以下是我在文件中的阅读方式: theString=unicode(open(excelFile).read(),'UTF-8','replace') 然后我使用lxml进行一些处理。这些文件有许多表,处理的第一步要求找到正确的表。我可以根据第一行第一个单元格中的单词查找表。这就是它变得棘手的地方。我本来希望使用正则

我正在开发一个程序(Python2.7),它可以读取xls文件(MHTML格式)。我遇到的问题之一是,文件包含非ascii的符号/字符。我最初的解决方案是使用unicode读取文件

以下是我在文件中的阅读方式:

theString=unicode(open(excelFile).read(),'UTF-8','replace')
然后我使用lxml进行一些处理。这些文件有许多表,处理的第一步要求找到正确的表。我可以根据第一行第一个单元格中的单词查找表。这就是它变得棘手的地方。我本来希望使用正则表达式来测试单元格的文本_content(),但发现单词的变体太多了(在3200个文件的测试运行中,我发现91种不同的方式表达了仅定义一个表的概念。因此,我决定转储特定单元格的所有文本内容,并使用excel中的一些算法严格识别所有变体

我用来编写文本_content()的代码是

我这样做是基于之前对类似问题的回答,这里的共识似乎是使用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时,Python也是如此。我以为我已经去掉了excel中的所有空格,但为了处理这些空格,我将它们拆分,然后合并

 labels=[''.joiin([word for word in label.split()] for label in labels])
我还没有回答一个问题。对不起,我还在想办法解决这个问题。在我看来,我在这里处理的是不一致的行为。当我最初读取字符串并使用unicode和UTF-8时,如果你愿意,所有字符都可以保留/传输。我对它们进行了编码以将其写出,它们显示得很好在Excel中,我将它们保存为一个txt文件,它们看起来还可以,但有些事情发生了,我似乎不知道在哪里

如果我可以避免写字符串来识别正确的标签,我有一种感觉,我的问题会消失,但有20000个或更多的标签。我可以使用正则表达式来大幅削减我的潜在列表,但其中一些只需要检查

作为旁白,我将注意到源文件都指定了charset='UTF-8'

重述-当我在使用unicode中读取sourcedocument和标签列表时,我无法进行一些匹配,因为标签中有一些字符被ufffd替换,当我在使用unicode中读取sourcedocument和标签列表时,没有进行任何特殊处理,我得到警告


我很想了解发生了什么,这样我就可以解决它,但我已经用尽了所有我能想到的地方去寻找它

不完全是一个解决方案,但类似的东西可能比跳过所有这些障碍更有意义。

只要使用unicode进行所有比较,使用的编码就无关紧要

我知道代码“\xa0”是不间断空格的代码

在字节字符串中,
\xA0
是一个字节,表示在一些编码中不间断的空格;其中最有可能的是Windows代码页1252(西欧)。但它肯定不是UTF-8,在UTF-8中,字节
\xA0
本身是无效的


使用
.decode('cp1252'))
将该字节字符串转换为Unicode而不是
'utf-8'
。通常,如果您想知道HTML文件的编码方式,请在
标记中查找charset参数;它可能会根据导出的内容而有所不同。

谢谢,但它实际上无法处理文件中的数据是的。谢谢你的回答,我必须尝试一下,但该文件不是二进制文件,它是一个MHTML文件。它在Excel中打开,但它是用于指定单元格中的值的标记,我不明白为什么它不同于unicode(openetc)@ PyNEwbie:每一个文件都是二进制文件。在文本模式下打开一个文件只需自动将文件解码为ASCII,这不是你想要的。当然每一个文件都是二进制的。我们讨论的是实际的和精确的。当它不包含任何特殊的嵌入式控制字符时,我不认为文件是二进制的;你可以查看CONE。使用编辑器更改文件,或使用打印机打印文件。---------=\u NextPart\u 12bb7e4c\u 1052\u 474f\u 96bf\u 94eba3dbc1c8内容位置:file:///C:/12bb7e4c_1052_474f_96bf_94eba3dbc1c8/Worksheets/Sheet05.html 内容传输编码:引用的可打印内容类型:text/html;charset=“us ascii”哇,有趣的是,这是双重无效的。
内容类型
邮件头
 labels=[''.joiin([word for word in label.split()] for label in labels])
import codecs
# read a utf8 encoded file and return the data as unicode
data = codecs.open(excelFile, 'rb', 'UTF-8').read()