Pyparsing чтения символов Unicode из файла - PullRequest
0 голосов
/ 15 октября 2018

Я хотел бы прочитать некоторые значения из файла 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

Но если я использую некоторые символы Юникода во входном файле.Он не работает должным образом.

sample.cfg (с символами Unicode)

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

Если вы запустите эту программу, ее вывод будет таким:

lke is T
fus is 4279677

Как вы видите, он игнорирует символы Юникода.

Обновление:

Я изменил код, как было предложено.Теперь это стало выглядеть так:

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 box.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Я нашел решение сам.Я не знаю, насколько это удобный способ добиться этого.Но мне кажется, что это нормально.

от импорта с пирипарингом *

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
0 голосов
/ 15 октября 2018

Замените alphanums на alphanums+alphas8bit в двух местах в вашем коде, как в этой строке.

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

Проблема в том, что alphanums соответствует только латинскому алфавиту без акцента (плюс цифры)).alphas8bit соответствует дополнительным 8-битным символам в латинице-1.

Когда я запускаю измененный код для этого ввода,

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
...