Pyparsing从文件中读取Unicode字符

时间:2018-10-15 14:26:48

标签: python python-3.x parsing pyparsing

我想从sample.cfg文件中读取一些值并进行解析。代码如下:

from pyparsing import *

key = Word(alphanums)('key')
equals = Suppress('=')
value = Word(alphanums)('value')

kvexpression = key + equals + value

with open('sample.cfg') as config_in:
  config_data = config_in.read()

for match in kvexpression.scanString(config_data):
  result = match[0]
  print("{0} is {1}".format(result.key, result.value))

如果我使用ASCII字符,则可以正常工作。像这样:

sample.cfg

city=Atlanta
state=Georgia
population=5522942

但是如果我在输入文件中使用一些unicode字符。它无法正常工作。

sample.cfg(带有Unicode字母)

şehir=İzmir
ülke=Türkiye
nüfus=4279677

如果运行此程序,其输出将如下所示:

lke is T
fus is 4279677

如您所见,它会忽略Unicode字符。

更新:

我按建议更改了代码。现在变成这样:

from pyparsing import*

key = Word(alphanums + alphas8bit)('key')
equals = Suppress('=')
value = Word(alphanums + alphas8bit)('value')

kvexpression = key + equals + value

with open('şehir.cfg') as config_in:
  config_data = config_in.read()

for match in kvexpression.scanString(config_data):
  result = match[0]
  print("{0} is {1}".format(result.key, result.value))

数据文件中的微小变化:

sample.cfg

şehir=İzmir
ülke=Türkiye
nüfus=4279677
alfabe=AaBbCcÇçDdEeFfGgĞğHhIiİiJjKkLlMmNnOoÖöPpRrSsŞşTtUuÜüVvYyZz

当我运行程序时,其输出是这样的。

ülke is Türkiye
nüfus is 4279677
alfabe is AaBbCcÇçDdEeFfGg

如您所见,第一行以重音s'ş'开始显示。我以前注意到这种情况。

快要到了,还不行。

我使用Linux机器。

2 个答案:

答案 0 :(得分:3)

alphanumsalphanums+alphas8bit替换为代码中的两个位置,如此行所示。

key = Word(alphanums+alphas8bit)('key')

问题在于alphanums仅匹配未重音的拉丁字母(加上数字)。 alphas8bit与Latin-1中的其他8位字符匹配。

当我针对此输入运行更改后的代码时,

sehir=Izmir
ülke=Türkiye
nüfus=4279677
AaBbCcÇçDdEeFfGgGgHhIiIiJjKkLlMmNnOoÖöPpRrSsSsTtUuÜüVvYyZz = 5

整个土耳其字母出现在最后一行的位置,结果是

sehir is Izmir
ülke is Türkiye
nüfus is 4279677
AaBbCcÇçDdEeFfGgGgHhIiIiJjKkLlMmNnOoÖöPpRrSsSsTtUuÜüVvYyZz is 5

答案 1 :(得分:2)

我已经找到了解决方案。我不知道这是否是实现此目的的便捷方法。但这对我来说很好。

来自pyparsing导入*

alphanums_tr = u'abcçdefgğhiijklmnoöprsştuüvyzABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZ0123456789'

key = Word(alphanums_tr)('key')
equals = Suppress('=')
value = Word(alphanums_tr)('value')

kvexpression = key + equals + value

with open('şehir.cfg') as config_in:
  config_data = config_in.read()

for match in kvexpression.scanString(config_data):
    result = match[0]
    print("{0} is {1}".format(result.key, result.value))

程序的输出如下:

şehir is İzmir
ülke is Türkiye
nüfus is 4279677
alfabe is AaBbCcÇçDdEeFfGgĞğHhIiİiJjKkLlMmNnOoÖöPpRrSsŞşTtUuÜüVvYyZz