簡體   English   中英

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

正如您所看到的那樣,第一行以重音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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM