В строке data=[int(x) if x else None for x in line.replace("\n","").split(",")]
ниже я хотел бы сохранить строковые значения в виде строки вместо того, чтобы генерировать исключение, если встречается значение, которое нельзя преобразовать в int. Есть ли какие-нибудь элегантные способы сделать это? Например, если у вас есть на заданной строке 9327,Garlic Powder,104,13
, тогда данные будут [9327, "Garlic Powder", 104, 13]
Рик
file = open(file_path, 'r')
# get headers
try:
header=next(file).replace("\n","").split(",")
except:
raise Exception("The file {} is empty.".format(file.file_path))
count = 0 # to count number of rows
# loop through file and process data
for line in file:
try:
data=[int(x) if x else None for x in line.replace("\n","").split(",")]
except:
raise Exception("The file {} contains invalid data.".format(file.file_path))
count += 1
for f in callback_array:
f(header,data)
Вы можете определить функцию, которая проверяет, может ли строка быть проанализирована до целого числа. Если это возможно, верните целое число, иначе верните строку
def parse(s):
#If string can be parsed as integer, return integer
try:
num = int(s)
return num
except:
pass
#Else return string
return s
line = '9327,Garlic Powder,104,13'
data=[parse(x) for x in line.replace("\n","").split(",")]
print(data)
Результат будет
[9327, 'Garlic Powder', 104, 13]
Вы можете сохранить свой oneliner, используя isnumeric
:
data=[int(x) if x and x.isnumeric() else x for x in line.replace("\n","").split(",")]
Это не будет работать для строк, содержащих отрицательные целые числа, например -1
Да, я просто опираюсь на его примерные данные. Если также включены отрицательные числа, вместо этого следует использовать функцию, подобную вашей.
Попробуй это,
>>> def type_convert(var):
if var.isnumeric():
return int(var)
elif isinstance(var, str):
return var
else:
return None
>>> [type_convert(i) for i in a]
[9327, 'Garlic Powder', 104, 13]
>>> new = [type_check(i) for i in a]
>>> [type(n) for n in new]
[<class 'int'>, <class 'str'>, <class 'int'>, <class 'int'>]
Это нормально, если мы попытаемся привести его к типу int и, основываясь на результате, вернуть либо строку, либо целое число @Rik?