Python 2.7:将 UTF-8 符号打印为列表失败,但循环访问列表会成功



目前我正在编写一个脚本,用于在.txt文件中搜索任何以微米为单位的测量值。这些文本文档通常使用mu符号"μ",这是乐趣开始的地方。

p = re.compile('d+.d+s?-?[uUµ][mM]')
file = open("text_to_be_searched.txt").read()
file = file.decode("utf-8")
match = re.findall(p, file)
if match == []:
    print "No matches found"
else:
    for i in range(len(match)):
        match[i] = match[i].replace("n", "") #cleans up line breaks
        print match[i] #prints correctly
print match #prints incorrectly

在上面的代码中,循环访问列表可以将值很好地打印到控制台。

1.06 µm
10.6 µm
3.8 µm

但是,如果我尝试打印列表,它会错误地显示它们。

[u'1.06 xb5m', u'10.6 xb5m', u'3.8 xb5m']

为什么 print 命令正确显示迭代值,但整个列表不正确?

编辑:感谢@BoarGules和其他人。

我发现

match[i] = match[i].replace("µ", "u")

返回的错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'xb5' in position 5: ordinal not in range(128)

Python对Unicode符号不在JoelonSoftware上解释的原始128个字符内感到生气。

但是通过简单地告诉它符号是Unicode:

match[i] = match[i].replace(u"µ", "u")

我们得到的结果更具可读性。

[u'1.06 um', u'10.6 um', u'3.8 um']

这至少是朝着正确方向迈出的一步。

这其实不是的:

[u'1.06 xb5m', u'10.6 xb5m', u'3.8 xb5m']

这是您必须在程序中手动键入的方式。如果您尝试执行此操作:

['1.06 µm','10.6 µm','3.8 µm']

你会得到一个源编码错误(除非你在程序的顶部放了一个encoding注释(。

它只是相同数据的不同表示形式。回想一下,列表是一种数据结构。您实际上无法像在内存中一样print它,因为它只是一堆字节。它必须被解释成类似于程序代码的东西,换句话说,变成一个字符串,要打印。口译员做一个通用的工作。它必须显示普通str型字符串和unicode字符串之间的差异(因此u"..."(,并且它必须转义ASCII字符集之外的字符。如果它不这样做,它的用处就会小得多。

如果您对列表的显示方式有固定的想法,那么您需要自己格式化它以进行输出。

最新更新