[英]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
正如您所看到的那樣,第一行以重音s'ş'開頭並未顯示。 我之前注意到了這種情況。
幾乎在那里,但並不完全。
我用的是linux盒子。
在代碼中的兩個位置用alphanums+alphas8bit
替換alphanums
,如此行所示。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.