json записывает нулевые десятичные строки, ведущие к странному выводу

#python #json

#python #json

Вопрос:

У меня проблема, которую трудно описать, потому что я не могу разработать небольшой пример, который выдает ошибку, которую я получаю. Однако я могу описать обстоятельства.

Работает следующий простой код:

 import json

data = ("0.5 cup corn")

with open('iam_working.json', 'w') as json_file:
    json.dump(data, json_file, sort_keys=True,  ensure_ascii=True, indent = 4)
  

Это работает, как и ожидалось, я получаю следующее:

 [
    "0.5 cup corn",
    "1 cup flour"
]
  

Однако в моем большом процессе, когда я обрабатываю пару тысяч строк, я получаю вывод, подобный (как показано в редакторе):

 [
    "0.u00025 cup corn",
    "1 cup flour"
]
  

Там, где это появляется 0.5 , заменяется специальным символом. Кстати, мне нужен ведущий 0 (т. Е. 0.5 Нет .5 ) из-за некоторой более поздней работы NLP.

В моем более крупном процессе я добавил пару тестовых строк:

 print(myStr)
print('type: ', type(myStr))
  

Они выдают строку, как и ожидалось:

 "0.5 cup corn"

type:  <class 'str'>
  

Когда я перечитываю файл json и печатаю строку, все выглядит нормально с этими отпечатками — т.е. "0.5"

Однако, если я попытаюсь преобразовать токен в число с плавающей запятой с помощью: float(myStr) .

Я получаю следующую ошибку:

 ValueError: could not convert string to float: '0.x025'
  

Мне нужно определить, что вызывает эти специальные символы моих десятичных чисел, или, как минимум, определить, как заставить float() их работать.

Комментарии:

1. Ваши строки поступают из файла? u0002 является ли юникод для «начала текста» ( en.wikipedia.org/wiki/List_of_Unicode_characters#Control_codes ), что означает, что он находится в строке, которую вы опубликовали. Когда вы печатаете его, он отображается нормально (попробуйте print("0.u00025") ), но он не может быть проанализирован как float .

2. Похоже, у вас есть байт ` x02″ в ваших данных. Это может не отображаться в вашем редакторе, но оно есть.

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

4. @jz_ Похоже, у вас могут быть некоторые строки замены со ссылками на группы, которые необходимо изменить на необработанные строки, т.е. '2' => r'2' .

5. "1 cup flour" В вашем примере нет. Какую версию Python вы используете? Python 2, как известно, сложнее с UTF, если вы используете 2, рассмотрите 3.

Ответ №1:

Эта ошибка связана с регулярным выражением. На самом деле, неправильно ссылается на подстроку. В RegEx101.com тест, ошибка показала, но выдала предупреждение. В Python это, казалось, выполнялось, но не давало ожидаемых результатов. Для записи здесь приведена ошибочная строка.

 myStr = re.sub("(?<![0-9]). (?=[0-9])", "0.2", myStr)
  

Он был заменен на:

  myStr = re.sub("(?<![0-9]). (?=[0-9])", "0.", myStr)
  

Комментарии:

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