0
votes

Convertir conditionnellement la chaîne en int

dans la ligne data = [int (x) si x autre personne pour x en ligne.replace ("\ n", ""). Split (",")] code> ci-dessous i ' D Aimez garder les valeurs de chaîne en tant que chaîne au lieu de jeter une exception si une valeur qui ne peut pas être coulée sur INT est rencontrée. Y a-t-il des façons élégantes de faire cela? Par exemple, si vous avez sur une ligne donnée 9327, la poudre d'ail, 104,13 code> puis les données seraient [9327, "poudre d'ail", 104, 13] code>

RIK P>

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)


1 commentaires

Est-ce que cette amende si nous essayons de le jeter à un int, et basé sur le résultat, retourner à la chaîne ou entier @rik?


3 Réponses :


1
votes

Vous pouvez définir une fonction qui vérifie si une chaîne peut être analysée vers un entier. Si cela peut, renvoyez l'entier d'autre retourner la chaîne xxx

la sortie sera xxx


0 commentaires

3
votes

Vous pouvez conserver votre ONEliner en utilisant iSnumeric : xxx


2 commentaires

Cela ne fonctionnera pas pour les chaînes contenant des entiers négatifs E.g -1


Oui, je suis simplement basé sur ses données d'échantillonnage. Si des nombres négatifs sont également inclus, devriez plutôt choisir une fonction comme la vôtre.



2
votes

Essayez ceci,

>>> 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'>]


0 commentaires