Pyparsing 从文件中读取 unicode 字符
Pyparsing reading unicode characters from file
我想从 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
如您所见,以重音符号“ş”开头的第一行未显示。我之前就注意到了这种情况。
快到了,但还不完全。
我用的是linux盒子。
将代码中两个地方的 alphanums
替换为 alphanums+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
我自己找到了解决办法。我不知道这是否是实现此目的的便捷方法。但我觉得还不错。
从 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
我想从 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
如您所见,以重音符号“ş”开头的第一行未显示。我之前就注意到了这种情况。
快到了,但还不完全。
我用的是linux盒子。
将代码中两个地方的 alphanums
替换为 alphanums+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
我自己找到了解决办法。我不知道这是否是实现此目的的便捷方法。但我觉得还不错。
从 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