Хотя вы можете проверить, чтобы каждый символ в подстроке isdigit
или просто try
преобразовался в int
, я бы рекомендовал не делать этого.Что если сегмент, для которого следует оставить строку по какой-то причине, также содержит только цифры?Также обратите внимание, что у вас также есть детали, которые могут нуждаться в преобразовании в float
.Вместо этого я бы рекомендовал использовать список типов, чтобы определить, как должна быть преобразована каждая часть, затем zip
с двумя и выполнить фактическое преобразование.
>>> line = '\ufeff87068,4,-1,0,0.916999995708465,0.9608271718025208,ANDROID,33,aa27f680-2ddb-4d61-b685-e29a15f9c85b,1,1,498\n'
>>> items_raw = line.strip().lstrip('\ufeff').split(",")
>>> types = [int, int, int, int, float, float, str, int, str, int, int, int]
>>> items = [t(x) for t, x in zip(types, items_raw)]
>>> items
[87068, 4, -1, 0,
0.916999995708465, 0.9608271718025208,
'ANDROID',
33,
'aa27f680-2ddb-4d61-b685-e29a15f9c85b',
1, 1, 498]
Вы также можете использовать умножение в списках длясделать список types
немного короче и, возможно, более читабельным, в частности, если в списке еще больше записей:
types = [int] * 4 + [float] * 2 + [str, int, str] + [int] * 3
Аналогичным образом вы можете создать другие списки для имен полей иzip
их с элементами в словаре понимания:
>>> fields = ["customer_id","listing_slot","closingIn","new_user","last_mile_distance","stress","customer_user_agent","listing_restaurant_sla","request_id","ld","city_id","restaurant_id"]
>>> d = {f: x for f, x in zip(fields, items)}
Или объединить его с преобразованием типов в одном словаре понимания:
>>> d = {f: t(x) for f, t, x in zip(fields, types, items_raw)}
В любом случае, d
заканчиваетсякак
{'city_id': 1,
'closingIn': -1,
'customer_id': 87068,
'customer_user_agent': 'ANDROID',
'last_mile_distance': 0.916999995708465,
'ld': 1,
'listing_restaurant_sla': 33,
'listing_slot': 4,
'new_user': 0,
'request_id': 'aa27f680-2ddb-4d61-b685-e29a15f9c85b',
'restaurant_id': 498,
'stress': 0.9608271718025208}