#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. Это не выдает ошибку, потому что вы не используете необработанные строки. Если бы у вас было, это вызвало бы недопустимую ошибку ссылки на группу. Неспособность использовать необработанные строки в шаблонах регулярных выражений — очень распространенная ошибка.