目前我正在编写一个脚本,用于在.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字符集之外的字符。如果它不这样做,它的用处就会小得多。
如果您对列表的显示方式有固定的想法,那么您需要自己格式化它以进行输出。