首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从文件中读取unicode字符的Pyparsing解析

从文件中读取unicode字符的Pyparsing解析
EN

Stack Overflow用户
提问于 2018-10-15 14:26:48
回答 2查看 208关注 0票数 4

我想从sample.cfg文件中读取一些值并解析它们。代码如下所示:

代码语言:javascript
复制
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

代码语言:javascript
复制
city=Atlanta
state=Georgia
population=5522942

但是如果我在输入文件中使用一些unicode字符。它不像预期的那样起作用。

sample.cfg (带有unicode字母)

代码语言:javascript
复制
şehir=İzmir
ülke=Türkiye
nüfus=4279677

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

代码语言:javascript
复制
lke is T
fus is 4279677

正如您所看到的,它忽略unicode字符。

更新:

我按建议修改了密码。现在变成这样:

代码语言:javascript
复制
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

代码语言:javascript
复制
şehir=İzmir
ülke=Türkiye
nüfus=4279677
alfabe=AaBbCcÇçDdEeFfGgĞğHhIiİiJjKkLlMmNnOoÖöPpRrSsŞşTtUuÜüVvYyZz

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

代码语言:javascript
复制
ülke is Türkiye
nüfus is 4279677
alfabe is AaBbCcÇçDdEeFfGg

正如您所看到的,没有显示以重音s开头的第一行'ş‘。我以前注意到过这种情况。

就快到了,但还不太好。

我用的是linux机器。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-16 06:53:36

我自己找到了解决办法。我不知道这是否是实现这一目标的方便方法。但在我看来没问题。

从pyparsing *

代码语言:javascript
复制
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))

程序的输出如下:

代码语言:javascript
复制
şehir is İzmir
ülke is Türkiye
nüfus is 4279677
alfabe is AaBbCcÇçDdEeFfGgĞğHhIiİiJjKkLlMmNnOoÖöPpRrSsŞşTtUuÜüVvYyZz
票数 2
EN

Stack Overflow用户

发布于 2018-10-15 20:50:41

在代码中的两处将alphanums替换为alphanums+alphas8bit,如下所示。

代码语言:javascript
复制
key = Word(alphanums+alphas8bit)('key')

问题是alphanums只匹配未加重音的拉丁字母(加上数字数字)。alphas8bit匹配拉丁文-1中的额外8位字符。

当我对这个输入运行修改后的代码时,

代码语言:javascript
复制
sehir=Izmir
ülke=Türkiye
nüfus=4279677
AaBbCcÇçDdEeFfGgGgHhIiIiJjKkLlMmNnOoÖöPpRrSsSsTtUuÜüVvYyZz = 5

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

代码语言:javascript
复制
sehir is Izmir
ülke is Türkiye
nüfus is 4279677
AaBbCcÇçDdEeFfGgGgHhIiIiJjKkLlMmNnOoÖöPpRrSsSsTtUuÜüVvYyZz is 5
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52818981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档