使用 if 语句将 CSV 行作为复杂列表理解的列表

Yield CSV row as list of complex list comprehension with if statements

我试图将 CSV 的每一行分别生成为 intfloatstr 的列表,同时将列表理解与 if 语句一起使用。

如何使用 if 语句编写列表理解,将 CSV 行的每个元素分别转换为 intfloatstr

问题:创建为字符串的浮点数。

import csv

FILE = "file.csv"

def all_values(file):
    with open(file, "r") as file_open:
        reader = csv.reader(file_open)
        for row in reader:
            yield [
                    int(x)
                    if x.isnumeric() else float(x)
                    if x.isdecimal() else x
                    for x in row
            ]

values = [x for x in all_values(FILE)]

print(values)

部分代码有问题:

            yield [
                    int(x)
                    if x.isnumeric() else float(x)
                    if x.isdecimal() else x
                    for x in row
            ]

文件:

100,"Jin",10.56
200,"Tonic",15.99
300,"Vodka",20.39

输出:

[[100, 'Jin', '10.56'], [200, 'Tonic', '15.99'], [300, 'Vodka', '20.39']]

错误的值类型:

'10.56''15.99''20.39'

感谢您的宝贵时间。

如评论中所述,isdecimal() 返回 False 因为 . 不被视为十进制字符。相反,您可以将代码更改为:

yield [
    int(x)
    if x.isnumeric() else float(x)
    if x.replace('.','',1).isdigit() else x
    for x in row
]

在这种情况下,检查的顺序很重要,int 必须在第一位。

如果它是浮点数或不是浮点数,另一个让它更安全的选项:

def is_float(element) -> bool:
    try:
        float(element)
        return True
    except ValueError:
        return False

def all_values(file):
    with open(file, "r") as file_open:
        reader = csv.reader(file_open)
        for row in reader:
            yield [
                    int(x)
                    if x.isnumeric() else float(x)
                    if is_float(x) else x
                    for x in row
            ]